Zaprogramuj moją kuchenkę mikrofalową [zamknięte]

12

Jestem bardzo leniwy, dlatego staram się zawsze programować kuchenkę mikrofalową przy jak najmniejszej liczbie naciśnięć przycisków . Moja kuchenka mikrofalowa ma następujące przyciski:

  • Przycisk „minut plus”, który można nacisnąć tylko jako pierwszy i oznacza „start”. Można go naciskać wiele razy przez wiele minut, ale nie doda minuty do ręcznie wprowadzonego czasu. Wynik+
  • Zestaw przycisków 0–9. Wprowadzanie czasu to MMSS (tzn. „130” oznacza 1 minutę i 30 sekund). Sekundy mogą mieścić się w zakresie od 0..99. Zatem „130” i „90” są odpowiednikami. Oczywiście każda minuta wynosi 60 sekund, nawet jeśli sekundowa część wpisu przekracza 59. Wyjście 0..9
  • Przycisk „start”, który należy nacisnąć, aby uruchomić kuchenkę mikrofalową, jeśli czas zostanie wprowadzony ręcznie. WynikS

Moje paczki żywności określają czas w MM: SS, więc program musi zaakceptować te dane wejściowe.

Przykłady

  • 1:00 jest +(pamiętaj, że „minuta plus” oznacza start)
  • 1:01 jest 61S(sekundy mogą przekraczać 59, ale „minut plus” nie działa w połączeniu z cyframi - myślę, że to wada projektowa mojej kuchenki mikrofalowej)
  • 9:00 jest 900S(krótszy niż +++++++++)
Ben Jackson
źródło
6
czy odpowiedzi zostaną zweryfikowane podczas kolacji?
nowy
1
co również ma pierwszeństwo: 400Slub ++++?
nowy
1
@ardnew: Myślę, że rozstrzygnięcie remisu powinno być minimalnym ruchem palca, dlatego ++++wygrywa. :)
Ben Jackson
ruch palca? więc jest 888Skrótszy niż 928S, ale 900Skrótszy niż 860S? Będę potrzebować dokładnej geometrii twoich przycisków i każdej z ich pozycji.
nowy
4
Gdybym musiał mikrofalować mój „Pedant's Meal for One” na 1:59, nacisnąłbym ++ (poczekaj na 1:59), a następnie nacisnąłem „anuluj” na sekundę przed końcem. Trzy naciśnięcia przycisku, zakładając, że masz przycisk „anuluj”, i uważaj patrzenie na minutnik za tani proces. Może możesz rozważyć tę opcję dla kolejnych posiłków! (Lub na kolejne wyzwanie)
Johno

Odpowiedzi:

3

APL

APL ma złą reputację, ponieważ jest nieczytelny, co zupełnie nie jest prawdą, jeśli nie jest golfem.

Zasady:

  • Całe minuty <= 4 otrzymują +, ++, +++ i ++++
  • 960-999 jest preferowane powyżej 1000-1039. 9960-9999 jest preferowany powyżej 10000-10039 itd.
  • Jeśli czas można przepisać w taki sposób, że sekundy wynoszą 66, 77, 88 lub 99, jest to wykonywane. (To nigdy nie daje gorszego rozwiązania i zwykle daje lepsze, tj. 888 zamiast 928.)
∇ Kuchenka mikrofalowa; czas; s; min; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← „Wprowadź godzinę (m +: ss)”
 czas ← ⍞
 mins secs ← ⍎¨ (czas ≠ ':') ⊂ czas

Minute „minut plus” można stosować tylko dla całych minut ≤ 4
 : Jeśli (s = 0) ∧ (min ≤ 4)
     ⎕ ← min⍴⍴ +
     :Powrót
 : EndIf
⍝ Jeśli to możliwe, zapisz naciśnięcie klawisza, używając sekund> 60
⍝ jeśli min jest potęgą dziesięciu
 : Jeśli (min> 0)
     : Jeśli ((⌈10⍟min.) = (⌊10⍟min.)) ∧ (sek. <40)
         ⎕ ← („BI2” ⎕FMT min-1), (⎕FMT s + 60), „S”
         :Powrót
     : EndIf
 : EndIf
⍝ W przypadku wymogu „ruchów palcami” chcemy tyle
⍝ naciśnięć klawiszy, aby uzyskać ten sam klawisz.
⍝ Więc 888S ipv 928S.
 : Jeśli sek = 66 77 88 99-60
     ⎕ ← („BI2” ⎕FMT min-1), (⎕FMT s + 60), „S”
     :Powrót
 : EndIf
⍝ W przeciwnym razie po prostu wyślij mmssS, nie było lepszej alternatywy.
 : Jeśli min.> 0
    ⍝ wyprowadza sekundy z wiodącym zerem
     ⎕ ← („BI2” ⎕FMT min), („G⊂99⊃'⎕FMT s),„ S ”
 :Jeszcze
    Output wyświetla tylko sekundy, a nie z wiodącym zerem
     ⎕ ← („BI2” ⎕FMT s), „S”
 : EndIf
∇
marinus
źródło
Nie określiłem kryteriów zwycięstwa, więc z mocą wsteczną wybiorę ten, który uczy mnie najwięcej o APL.
Ben Jackson,
@BenJackson Wyzwania wymagają obiektywnego kryterium wygranej. Zobacz opis użytego znacznika [kod-wyzwanie].
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'
nieokreślony
źródło
3

Perl

spełnia wymagania, ale nie tak wpisuje się przyciski (np. „860S” vs. „900S”) obsługuje dokładnie 60 sekund w specjalnym przypadku

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

Wynik

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
źródło
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

Uwagi:

  • Rozpocznij od, ruby program-my-microwave-oven.rba test jednostkowy zostanie oceniony.
  • Zacznij od ruby program-my-microwave-oven.rb 10:00i pisze960S

Kilka uwag na temat zasad (i mojej interpretacji):

  • Najkrótszy 10:00to 960S(9 minut i 60 sekund -> 10 minut).
  • Najkrótszy 10:39to 999S(9 minut i 99 sekund -> 10 minut i 39 sekund).
  • bo 4:00woli ++++(mniej ruchów palcami)
knut
źródło