Programmieren Sie meine Mikrowelle [geschlossen]

12

Ich bin sehr faul und versuche, meine Mikrowelle immer mit möglichst wenigen Tastendrücken zu programmieren . Meine Mikrowelle hat folgende Tasten:

  • Eine "Minute Plus" -Taste, die nur zuerst gedrückt werden darf und "Start" impliziert. Es kann mehrere Minuten lang mehrmals gedrückt werden, es wird jedoch keine Minute zu einer manuell eingegebenen Zeit hinzugefügt. Ausgabe+
  • Eine Reihe von 0-9 Tasten. Die Zeitangabe ist MMSS (dh "130" bedeutet 1 Minute 30 Sekunden). Sekunden können von 0..99 reichen. "130" und "90" sind also äquivalente Einträge. Offensichtlich beträgt jede Minute 60 Sekunden, auch wenn der Sekundenanteil des Eintrags 59 überschreitet. Ausgabe 0..9
  • Eine "Start" -Taste, die gedrückt werden muss, um die Mikrowelle zu starten, wenn die Uhrzeit manuell eingegeben wird. AusgabeS

Meine Lebensmittelpakete geben die Zeit in MM: SS an, und das Programm muss diese Eingabe akzeptieren.

Beispiele

  • 1:00 ist +(denken Sie daran, "Minute plus" impliziert Start)
  • 1:01 ist 61S(Sekunden können 59 überschreiten, aber "Minute plus" funktioniert nicht in Verbindung mit Ziffern - ich denke, dies ist ein Konstruktionsfehler in meiner Mikrowelle)
  • 9:00 ist 900S(kürzer als +++++++++)
Ben Jackson
quelle
6
Werden die Antworten bei Ihrem Abendessen überprüft?
ardnew
1
auch was hat vorrang: 400Soder ++++?
ardnew
1
@ardnew: Ich denke, Tiebreak sollte minimale Fingerbewegung sein, also ++++gewinnt. :)
Ben Jackson
Fingerbewegung? also ist 888Skürzer als 928S, aber 900Skürzer als 860S? Ich werde eine genaue Geometrie Ihrer Knöpfe und jeder ihrer Positionen benötigen.
ardnew
4
Wenn ich mein "Pedant's Meal for One" für 1:59 in die Mikrowelle stellen müsste, würde ich ++ drücken (auf 1:59 warten) und dann eine Sekunde vor Ende "Abbrechen" drücken. Drei Tastendrücke, vorausgesetzt Sie haben eine "Abbrechen" -Taste und betrachten es als einen billigen Prozess, den Timer anzustarren. Vielleicht können Sie diese Option für nachfolgende Mahlzeiten in Betracht ziehen! (Oder für eine spätere Herausforderung)
Johno

Antworten:

3

APL

APL hat den schlechten Ruf, dass es nicht lesbar ist, was ganz und gar nicht der Fall ist, wenn es nicht Golf spielt.

Die Regeln:

  • Ganze Minuten <= 4 erhalten +, ++, +++ und ++++
  • 960-999 ist gegenüber 1000-1039 bevorzugt. 9960-9999 ist gegenüber 10000-10039 usw. bevorzugt.
  • Wenn die Zeit so umgeschrieben werden kann, dass die Sekunden 66, 77, 88 oder 99 sind, ist dies erledigt. (Dies gibt niemals eine schlechtere Lösung und normalerweise eine bessere, dh 888 statt 928.)
∇ Mikrowelle, Zeit, Sekunden, Minuten, fmt, ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Zeit eingeben (m +: ss)'
 Zeit ← ⍞
 Minuten Sekunden ← ⍎¨ (Zeit ≠ ':') ⊂Zeit

⍝ 'minute plus' kann nur für ganze Minuten ≤ 4 verwendet werden
 : If (secs = 0) ∧ (mins≤4)
     ⎕ ← Minuten⍴ '+'
     :Rückkehr
 : EndIf
⍝ Speichern Sie nach Möglichkeit einen Tastendruck mit Sekunden> 60
⍝ Wenn min eine Zehnerpotenz ist
 : If (min> 0)
     : If ((~ 10 ~ min) = (~ 10 ~ min)) sec (secs <40)
         ⎕ ← ('BI2'⎕FMT Minuten-1), (⎕FMT Sekunden + 60),' S '
         :Rückkehr
     : EndIf
 : EndIf
⍝ Für die Anforderung 'Fingerbewegung' wollen wir so viele
⍝ der Tastendrücke soll möglichst von der gleichen Taste sein.
⍝ Also 888S ipv 928S.
 : Wenn secs∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT Minuten-1), (⎕FMT Sekunden + 60),' S '
     :Rückkehr
 : EndIf
⍝ Ansonsten, nur mmssS ausgeben, gab es keine bessere Alternative.
 : Wenn min> 0
    ⍝ Sekunden mit führender Null ausgeben
     ⎕ ← ('BI2'⎕FMT Minuten), (' G⊂99⊂'⊃FMT Sekunden), 'S'
 :Sonst
    ⍝ Nur Sekunden ausgeben, nicht mit führender Null
     ⎕ ← ('BI2'⎕FMT secs),' S '
 : EndIf
∇
Marinus
quelle
Ich habe kein Gewinnkriterium angegeben, daher werde ich rückwirkend das auswählen, das mir am meisten über APL beibringt.
Ben Jackson
@BenJackson Challenges erfordern ein objektives Gewinnkriterium. Siehe die Beschreibung des von Ihnen verwendeten Tags [code-challenge].
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'
nicht definiert
quelle
3

Perl

erfüllt die Anforderungen, aber es ist nicht, wie ich die Tasten eingeben würde (zB "860S" vs "900S") behandelt genau 60 Sekunden als Sonderfall

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), $/;

Ausgabe

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
seltsam
quelle
1

Rubin

#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

Bemerkungen:

  • Beginnen Sie mit ruby program-my-microwave-oven.rbund ein Unit-Test wird ausgewertet.
  • Beginnen Sie mit ruby program-my-microwave-oven.rb 10:00und es schreibt960S

Einige Anmerkungen zu den Regeln (und meiner Interpretation):

  • Die kürzeste Zeit 10:00ist 960S(9 Minuten und 60 Sekunden -> 10 Minuten).
  • Die kürzeste Zeit 10:39ist 999S(9 Minuten und 99 Sekunden -> 10 Minuten und 39 Sekunden).
  • denn 4:00es bevorzugt ++++(weniger Fingerbewegungen)
knut
quelle