Programmer mon four à micro-ondes [fermé]

12

Je suis très paresseux alors j'essaie de toujours programmer mon micro-ondes avec le moins de pressions de bouton possible . Mon micro-ondes a les boutons suivants:

  • Un bouton "minute plus" qui ne peut être enfoncé qu'en premier et qui implique "démarrer". Il peut être pressé plusieurs fois pendant plusieurs minutes, mais il n'ajoutera pas une minute à une heure entrée manuellement. Production+
  • Un ensemble de boutons 0-9. L'entrée de temps est MMSS (c.-à-d. "130" signifie 1 minute 30 secondes). Les secondes peuvent varier de 0 à 99. Ainsi, "130" et "90" sont des entrées équivalentes. Évidemment, chaque minute est de 60 secondes même si la partie des secondes de l'entrée dépasse 59. Sortie 0..9
  • Un bouton "start" qui doit être enfoncé pour démarrer le micro-ondes si l'heure est entrée manuellement. ProductionS

Mes emballages alimentaires spécifient l'heure en MM: SS et le programme doit donc accepter cette entrée.

Exemples

  • 1:00 est +(rappelez-vous que "minute plus" implique le début)
  • 1:01 est 61S(les secondes peuvent dépasser 59, mais la "minute plus" ne fonctionne pas avec les chiffres - je pense que c'est un défaut de conception dans mon micro-ondes)
  • 9:00 est 900S(plus court que +++++++++)
Ben Jackson
la source
6
les réponses seront-elles vérifiées avec votre dîner?
ardnew
1
aussi qui a priorité: 400Sou ++++?
ardnew
1
@ardnew: Je suppose que le tie-break devrait être un mouvement minimum des doigts, donc ++++gagne. :)
Ben Jackson
mouvement des doigts? est donc 888Splus court que 928S, mais 900Splus court que 860S? je vais avoir besoin d'une géométrie précise de vos boutons et de chacune de leurs positions.
ardnew
4
Si je devais micro-ondes mon "Repas de pédant pour un" pour 1:59, j'appuyer sur ++ (attendre 1:59), puis appuyez sur "Annuler" une seconde avant la fin. Trois pressions de bouton, en supposant que vous avez un bouton "Annuler" et que vous considérez que regarder la minuterie est un processus bon marché. Vous pourriez peut-être envisager cette option pour les repas suivants! (Ou pour un défi ultérieur)
Johno

Réponses:

3

APL

APL a une mauvaise réputation car il est illisible, ce qui n'est absolument pas le cas s'il n'est pas joué au golf.

Les règles:

  • Minutes entières <= 4 obtenez +, ++, +++ et ++++
  • 960-999 est préféré au-dessus de 1000-1039. 9960-9999 est préféré au-dessus de 10000-10039, etc.
  • Si l'heure peut être réécrite de façon à ce que les secondes soient 66, 77, 88 ou 99, alors cela est fait. (Cela ne donne jamais une pire solution et donne généralement une meilleure, à savoir 888 au lieu de 928.)
∇ Micro-ondes; temps; secondes; minutes; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Entrez l'heure (m +: ss)'
 temps ← ⍞
 minutes secs ← ⍎¨ (heure ≠ ':') ⊂ heure

⍝ 'minute plus' ne peut être utilisé que sur des minutes entières ≤ 4
 : Si (secondes = 0) ∧ (minutes≤4)
     ⎕ ← min⍴ '+'
     :Revenir
 :Fin si
⍝ Si possible, enregistrez une pression de touche en utilisant secondes> 60
⍝ si mins est une puissance de dix
 : Si (min> 0)
     : Si ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (s <40)
         ⎕ ← ('BI2'⎕FMT min-1), (⎕FMT s + 60),' S '
         :Revenir
     :Fin si
 :Fin si
⍝ Pour l'exigence de «mouvement des doigts», nous voulons autant
⍝ des touches que possible pour être de la même touche.
⍝ Donc 888S ipv 928S.
 : Si secondes∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT min-1), (⎕FMT s + 60),' S '
     :Revenir
 :Fin si
⍝ Sinon, il suffit de sortir mmssS, il n'y avait pas de meilleure alternative.
 : Si min> 0
    ⍝ secondes de sortie avec zéro devant
     ⎕ ← ('BI2'⎕FMT minutes), (' G⊂99⊃'⎕FMT secondes), 'S'
 :Autre
    ⍝ ne produit que les secondes, pas avec un zéro en tête
     ⎕ ← ('BI2'⎕FMT secs),' S '
 :Fin si
∇
marinus
la source
Je n'ai pas précisé de critère de gain, je vais donc choisir rétroactivement celui qui m'apprend le plus sur l'APL.
Ben Jackson
Les défis @BenJackson nécessitent un critère de victoire objectif. Voir la description de la balise [code-challenge] que vous avez utilisée.
mbomb007
4

Javascript

var x = /(\d+):(\d\d)/.exec('<time here>');
x[1] === '0' ? +x[2] + 'S' :
x[1] < 4 && x[2] === '00' ? (
    x[1] === '1' ? '+' :
    x[1] === '2' ? '++' : '+++') :
x[2] < 40 ?
    (x[1] - 1 ? x[1] - 1 : '') + '' + (6 + +x[2][0]) + x[2][1] + 'S' :
x[1] + x[2] + 'S'
indéfini
la source
3

Perl

répond aux exigences, mais ce n'est pas comme cela que j'entrerais les boutons (par exemple "860S" vs "900S") gère exactement 60 secondes comme un cas spécial

use strict;
use warnings;

sub cook
{
  my ($mins, $secs) = @_;

  my $plus = $secs =~ /00/ ? $mins : undef;

  my $secs_total = $mins * 60 + $secs;
  my $mins_total = 0;

  while ($secs_total > 99)
  {
    ++$mins_total;
    $secs_total -= 60;
  }

  $plus = "+" x $plus if defined $plus;

  my $nums = "";
  my $even = ($mins_total > 0 and $secs_total == 60);

  $secs_total *= not $even;
  $mins_total += $even;

  if ($mins_total > 0)
  {
    $nums = sprintf "%s%02dS", $mins_total, $secs_total;
  }
  else
  {
    $nums = sprintf "%2dS", $secs_total;
  }

  return ($nums, $plus)
    [defined $plus and length $plus < length $nums];
}

die "usage:$/\tperl $0 <MINUTES>:<SECONDS>$/"
  unless @ARGV > 0 and shift =~ /([0-9]{1,2}):([0-9]{1,2})/;

print cook($1, $2), $/;

Production

andrew@gidget:~$ perl mic.pl 9:00
900S
andrew@gidget:~$ perl mic.pl 1:00
+
andrew@gidget:~$ perl mic.pl 1:01
61S
andrew@gidget:~$ perl mic.pl 1:30
90S
andrew@gidget:~$ perl mic.pl 0:07
 7S
andrew@gidget:~$ perl mic.pl 4:00
400S
ardnew
la source
1

rubis

#Build a string for the microwave
def build_result(minutes, seconds)
  duration = minutes * 60 + seconds  
  if duration < 99
    result = "%iS" % [ duration]    #shortcut '90S' instead '130S'
  else
    result = "%i%02iS" % [ minutes, seconds]
  end  
  result
end

#Call microwave optimizer
def microwave( input )
  minutes  = input.split(/:/).first.to_i 
  seconds = input.split(/:/).last.to_i

  #build result
  result = build_result(minutes, seconds)
  #try a shorter result, make 999S out of '10:39':
  if seconds < 40 and minutes > 0
    result2 = build_result(minutes - 1, seconds + 60)   #try a 
    result = ( result.size <= result2.size ? result : result2 )
  end

  #Check if a version with only '+' is shorter
  if seconds == 0 and minutes <= result.size
    result = '+' * minutes
  end
  result
end

#Test if called with an argument
if ARGV.empty?
  require 'test/unit'   #Exceute a test
  class MicrowaveTest < Test::Unit::TestCase
    def test_007
      assert_equal('7S', microwave('0:07'))
    end  
    def test_100
      assert_equal('+', microwave('1:00'))
    end
    def test_101
      assert_equal('61S', microwave('1:01'))
    end  
    def test_130
      assert_equal('90S', microwave('1:30'))
    end  
    def test_400
      #~ assert_equal('400S', microwave('4:00'))
      assert_equal('++++', microwave('4:00'))
    end  
    def test_500
      assert_equal('500S', microwave('5:00'))
    end  
    def test_900
      assert_equal('900S', microwave('9:00'))
    end 
    def test_1000
      #~ assert_equal('1000S', microwave('10:00'))
      assert_equal('960S', microwave('10:00'))
    end 
    def test_1015
      #~ assert_equal('1015S', microwave('10:15'))
      assert_equal('975S', microwave('10:15'))
    end 
    def test_1039
      #~ assert_equal('1039S', microwave('10:39'))
      assert_equal('999S', microwave('10:39'))
    end 
  end
else  #started via shell, evaluate input
  puts microwave(ARGV.first)
end

Remarques:

  • Commencez avec ruby program-my-microwave-oven.rbet un test unitaire est évalué.
  • Commencez avec ruby program-my-microwave-oven.rb 10:00et il écrit960S

Quelques remarques sur les règles (et mon interprétation):

  • Le plus court 10:00est 960S(9 minutes et 60 secondes -> 10 minutes).
  • Le plus court 10:39est 999S(9 minutes et 99 secondes -> 10 minutes et 39 secondes).
  • car 4:00il préfère ++++(moins de mouvements des doigts)
knut
la source