Programma il mio forno a microonde [chiuso]


12

Sono molto pigro, quindi cerco di programmare sempre il mio forno a microonde con il minor numero possibile di pulsanti . Il mio forno a microonde ha i seguenti pulsanti:

  • Un pulsante "minuti più" che può essere premuto solo per primo e implica "avvio". Può essere premuto più volte per più minuti, ma non aggiungerà un minuto a un'ora immessa manualmente. Produzione+
  • Un set di pulsanti 0-9. L'immissione dell'ora è MMSS (ovvero "130" significa 1 minuto e 30 secondi). I secondi possono variare da 0 a 99. Quindi "130" e "90" sono voci equivalenti. Ovviamente ogni minuto è di 60 secondi anche se la parte dei secondi della voce supera 59. Uscita 0..9
  • Un pulsante "start" che deve essere premuto per avviare il microonde se l'ora viene inserita manualmente. ProduzioneS

I miei pacchetti alimentari specificano il tempo in MM: SS e quindi il programma deve accettare quell'input.

Esempi

  • 1:00 è +(ricordare "minuto più" implica l'inizio)
  • 1:01 è 61S(i secondi possono superare 59, ma "minute plus" non funziona in combinazione con le cifre - penso che questo sia un difetto di progettazione nel mio forno a microonde)
  • 9:00 è 900S(più corto di +++++++++)

6
le risposte saranno verificate con la tua cena?
Ardnew,

1
anche che ha la precedenza: 400So ++++?
Ardnew,

1
@ardnew: immagino che il tiebreak dovrebbe essere il minimo movimento delle dita, quindi ++++vince. :)
Ben Jackson,

movimento delle dita? quindi è 888Spiù corto di 928S, ma 900Spiù corto di 860S? avrò bisogno di una geometria precisa dei tuoi pulsanti e di ciascuna delle loro posizioni.
Ardnew,

4
Se dovessi microonde il mio "Pedant's Meal for One" per 1:59, premere ++ (attendere 1:59) e quindi premere "annulla" un secondo prima della fine. Premi tre pulsanti, supponendo che tu abbia un pulsante "annulla" e consideri il fissare il timer come un processo economico. Forse potresti prendere in considerazione questa opzione per i pasti successivi! (O per una sfida successiva)
Johno,

Risposte:


3

APL

APL ha una pessima reputazione di essere illeggibile, il che non è assolutamente vero se non si gioca a golf.

Le regole:

  • Interi minuti <= 4 get +, ++, +++ e ++++
  • 960-999 è preferito sopra 1000-1039. 9960-9999 è preferito sopra 10000-10039, ecc.
  • Se il tempo può essere riscritto in modo tale che i secondi siano 66, 77, 88 o 99, questo è fatto. (Questo non dà mai una soluzione peggiore e di solito ne dà una migliore, cioè 888 invece di 928.)
∇ Microonde; tempo; secondi; minuti; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Inserire l'ora (m +: ss)'
 tempo ← ⍞
 minuti secondi ← ⍎¨ (time ≠ ':') ⊂time

⍝ 'minuto più' può essere utilizzato solo su minuti interi ≤ 4
 : If (secs = 0) ∧ (mins≤4)
     ⎕ ← mins⍴ '+'
     :Ritorno
 :Finisci se
⍝ Se possibile, salvare un tasto premendo secondi> 60
⍝ se min è una potenza di dieci
 : If (minuti> 0)
     : If ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (secondi <40)
         ⎕ ← ('BI2'⎕FMT mins-1), (⎕FMT secs + 60),' S '
         :Ritorno
     :Finisci se
 :Finisci se
⍝ Per il requisito del "movimento delle dita" ne vogliamo altrettanti
⍝ dei tasti premuti il ​​più possibile per essere della stessa chiave.
⍝ Quindi 888S ipv 928S.
 : Se sec∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT mins-1), (⎕FMT secs + 60),' S '
     :Ritorno
 :Finisci se
⍝ Altrimenti, solo output mmssS, non c'era alternativa migliore.
 : Se minuti> 0
    ⍝ uscita secondi con zero iniziale
     ⎕ ← ('BI2'⎕FMT min), (' G⊂99⊃'⎕FMT sec), 'S'
 :Altro
    ⍝ solo secondi in uscita, non con zero iniziale
     ⎕ ← ('BI2'⎕FMT sec),' S '
 :Finisci se
∇

Non ho specificato un criterio vincente, quindi sceglierò retroattivamente quello che mi insegna di più sull'APL.
Ben Jackson,

Le sfide di @BenJackson richiedono un criterio vincente oggettivo. Vedi la descrizione del tag [code-challenge] che hai usato.
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'

3

Perl

soddisfa i requisiti, ma non è come vorrei inserire i pulsanti (ad esempio "860S" vs "900S") gestisce esattamente 60 secondi come un caso speciale

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

Produzione

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

1

rubino

#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

Osservazioni:

  • Iniziare con ruby program-my-microwave-oven.rbe viene valutato un test unitario.
  • Inizia con ruby program-my-microwave-oven.rb 10:00e scrive960S

Alcune osservazioni sulle regole (e sulla mia interpretazione):

  • Il più breve 10:00è 960S(9 minuti e 60 secondi -> 10 minuti).
  • Il più breve 10:39è 999S(9 minuti e 99 secondi -> 10 minuti e 39 secondi).
  • per 4:00predilige ++++(meno movimenti delle dita)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.