Programar mi horno microondas [cerrado]

12

Soy muy vago, así que trato de programar siempre mi microondas con la menor cantidad posible de pulsaciones de botones . Mi microondas tiene los siguientes botones:

  • Un botón de "minuto más" que solo se puede presionar primero e implica "iniciar". Puede presionarse varias veces durante varios minutos, pero no agregará un minuto a una hora ingresada manualmente. Salida+
  • Un conjunto de 0-9 botones. La entrada de tiempo es MMSS (es decir, "130" significa 1 minuto y 30 segundos). Los segundos pueden variar de 0 a 99. Entonces "130" y "90" son entradas equivalentes. Obviamente cada minuto es de 60 segundos, incluso si la parte de segundos de la entrada excede 59. Salida 0..9
  • Un botón de "inicio" que debe presionarse para encender el microondas si la hora se ingresa manualmente. SalidaS

Mis paquetes de comida especifican el tiempo en MM: SS, por lo que el programa debe aceptar esa entrada.

Ejemplos

  • 1:00 es +(recuerde "minuto más" implica comenzar)
  • 1:01 es 61S(los segundos pueden exceder 59, pero "minuto más" no funciona junto con los dígitos; creo que este es un defecto de diseño en mi microondas)
  • 9:00 es 900S(más corto que +++++++++)
Ben Jackson
fuente
66
¿serán verificadas las respuestas con su cena?
ardnew
1
También que tiene prioridad: 400So ++++?
ardnew
1
@ardnew: supongo que el desempate debe ser un movimiento mínimo de los dedos, por lo tanto, ++++gana. :)
Ben Jackson
movimiento de los dedos? entonces es 888Smás corto que 928S, pero 900Smás corto que 860S? Voy a necesitar una geometría precisa de sus botones y cada una de sus posiciones.
ardnew
44
Si tuviera que calentar mi "Pedant's Meal for One" en el microondas por 1:59, presionaría ++ (esperar 1:59) y luego presionar "cancelar" un segundo antes del final. Presionar tres botones, suponiendo que tenga un botón de "cancelar" y considere quedarse mirando el temporizador como un proceso barato. ¡Quizás podría considerar esta opción para las comidas posteriores! (O para un desafío posterior)
Johno

Respuestas:

3

APL

APL tiene una mala reputación de que es ilegible, lo cual no es el caso si no se juega al golf.

Las normas:

  • Minutos completos <= 4 get +, ++, +++ y ++++
  • Se prefiere 960-999 por encima de 1000-1039. 9960-9999 se prefiere por encima de 10000-10039, etc.
  • Si el tiempo puede reescribirse de tal manera que los segundos sean 66, 77, 88 o 99, entonces esto se hace. (Esto nunca da una solución peor y generalmente da una mejor, es decir, 888 en lugar de 928).
∇ Microondas; tiempo; segundos; minutos; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Ingrese el tiempo (m +: ss)'
 tiempo ← ⍞
 minutos segundos ← ⍎¨ (hora ≠ ':') ⊂hora

Minute 'minuto plus' solo se puede usar en minutos enteros ≤ 4
 : Si (segundos = 0) ∧ (minutos≤4)
     ⎕ ← minutos⍴ '+'
     :Regreso
 :Terminara si
⍝ Si es posible, guarde una pulsación de tecla usando segundos> 60
⍝ si minutos es una potencia de diez
 : Si (minutos> 0)
     : If ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (segundos <40)
         ⎕ ← ('BI2'⎕FMT min-1), (⎕FMT segundos + 60),' S '
         :Regreso
     :Terminara si
 :Terminara si
⍝ Para el requisito de 'movimiento de los dedos' queremos tantos
⍝ de las pulsaciones de teclas posibles para ser de la misma tecla.
⍝ Entonces 888S ipv 928S.
 : Si secs∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT min-1), (⎕FMT segundos + 60),' S '
     :Regreso
 :Terminara si
⍝ De lo contrario, solo genera mmssS, no había mejor alternativa.
 : Si minutos> 0
    ⍝ segundos de salida con cero a la izquierda
     ⎕ ← ('BI2'⎕FMT minutos), (' G⊂99⊃'⎕FMT segundos), 'S'
 :Más
    ⍝ solo segundos de salida, no con cero a la izquierda
     ⎕ ← ('BI2'⎕FMT segundos),' S '
 :Terminara si
∇
marinus
fuente
No especifiqué un criterio ganador, por lo que elegiré retroactivamente el que más me enseñe sobre APL.
Ben Jackson
Los desafíos de @BenJackson requieren un criterio ganador objetivo. Consulte la descripción de la etiqueta [code-challenge] que utilizó.
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'
indefinido
fuente
3

Perl

cumple con los requisitos, pero no es cómo ingresaría los botones (por ejemplo, "860S" frente a "900S") maneja exactamente 60 segundos como un caso especial

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

Salida

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
fuente
1

rubí

#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

Observaciones:

  • Comience con ruby program-my-microwave-oven.rby se evalúa una prueba unitaria.
  • Comience con ruby program-my-microwave-oven.rb 10:00y escribe960S

Algunas observaciones sobre las reglas (y mi interpretación):

  • El más corto 10:00es 960S(9 minutos y 60 segundos -> 10 minutos).
  • El más corto 10:39es 999S(9 minutos y 99 segundos -> 10 minutos y 39 segundos).
  • porque 4:00lo prefiere ++++(menos movimientos de los dedos)
Knut
fuente