Mikrodalga fırınımı programla [kapalı]


12

Çok tembelim, bu yüzden mikrodalga fırınımı her zaman mümkün olan en az düğmeye basarak programlamaya çalışıyorum . Mikrodalga fırınım aşağıdaki düğmelere sahiptir:

  • Yalnızca ilk basılabilen ve "başlat" anlamına gelen "dakika artı" düğmesi. Birden dakika birden çok kez basılması olabilir, ama olacak değil bir el ile girilen süre için bir dakika ekleyin. Çıktı+
  • 0-9 düğme kümesi. Zaman girişi MMSS'dir (yani "130", 1 dakika 30 saniye anlamına gelir). Saniye 0,99 arasında değişebilir. Yani "130" ve "90" eşdeğer girişlerdir. Açıkçası her bir dakika girişin saniye kısmı 59'u geçse bile 60 saniyedir. Çıktı 0..9
  • Zamanın manuel olarak girilmesi durumunda mikrodalga fırını başlatmak için basılması gereken bir "başlat" düğmesi. ÇıktıS

Gıda paketlerim MM: SS cinsinden zamanı belirtir ve dolayısıyla programın bu girişi kabul etmesi gerekir.

Örnekler

  • 1:00 +(hatırlayın "dakika artı" başlangıç ​​anlamına gelir)
  • 1:01 61S(saniyeler 59'u geçebilir, ancak "dakika artı" rakamlarla birlikte çalışmaz - bence bu mikrodalga fırınımda bir tasarım hatası)
  • 9:00 900S(daha kısa +++++++++)

6
cevaplar akşam yemeğinizle doğrulanacak mı?
ardnew

1
ayrıca öncelikli olan: 400Sveya ++++?
ardnew

1
@ardnew: Tiebreak minimum parmak hareketi olmalı, bu yüzden ++++kazanıyor. :)
Ben Jackson

parmak hareketi? yani daha 888Skısa 928S, ama 900Sdaha kısa 860S? Düğmelerinizin ve konumlarının her birinin kesin geometrisine ihtiyacım olacak.
ardnew

4
Eğer “Pedant's Meal for One” ı 1:59 için mikrodalga yapmak zorunda kalsaydım, ++ 'a basardım (1:59 için bekle) ve sonra sondan bir saniye önce "iptal" e basardım. "İptal" düğmesine sahip olduğunuzu varsayarsanız ve zamanlayıcıya bakmayı ucuz bir işlem olarak kabul ederseniz, üç düğmeye basın. Belki daha sonraki yemekler için bu seçeneği düşünebilirsiniz! (Veya daha sonraki bir meydan okuma için)
Johno

Yanıtlar:


3

APL

APL, okunamaz olduğu konusunda kötü bir üne sahiptir, bu da golf değilse kesinlikle durum böyle değildir.

Kurallar:

  • Tüm dakikalar <= 4 get +, ++, +++ ve ++++
  • 1000-1039'un üzerinde 960-999 tercih edilir. 9960-9999, 10000-10039 vb. Yukarıda tercih edilir.
  • Zaman, saniye 66, 77, 88 veya 99 olacak şekilde yeniden yazılabilirse, bu yapılır. (Bu asla daha kötü bir çözüm sunmaz ve genellikle daha iyi bir çözüm verir, yani 928 yerine 888).)
Rowave Mikrodalga; zaman; saniye; dakika; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Saati girin (m +: ss)'
 Zaman ← ⍞
 dakika saniye ← ⍎¨ (zaman ≠ ':') ⊂ zaman

⍝ 'dakika artı' sadece bütün dakikalarda kullanılabilir ≤ 4
 : Eğer (saniye = 0) ∧ (dakika≤4)
     ⎕ ← mins⍴ '+'
     :Dönüş
 : EndIf
Possible Mümkünse, saniye> 60 tuşlarını kullanarak bir tuşa basın
⍝ dakika on güçse
 : Eğer (dakika> 0)
     : Eğer ((⌈10⍟dakika) = (⌊10⍟dakika)) ∧ (saniye <40)
         ⎕ ← ('BI2'⎕FMT dakika-1), (⎕FMT saniye + 60),' S '
         :Dönüş
     : EndIf
 : EndIf
Finger 'Parmak hareketi' gereksinimi için
Key tuşlarına aynı tuşta basın.
⍝ Yani 888S ipv 928S.
 : Eğer sn∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT dakika-1), (⎕FMT saniye + 60),' S '
     :Dönüş
 : EndIf
⍝ Aksi takdirde, sadece mmssS çıktısı, daha iyi bir alternatif yoktu.
 : Dakika> 0 ise
    Leading Baştaki sıfır ile çıkış saniyesi
     ⎕ ← ('BI2'⎕FMT dakika), (' G⊂99⊃'⊃FMT saniye), 'S'
 :Başka
    ⍝ sadece çıkış saniyesi, baştaki sıfır ile değil
     ⎕ ← ('BI2'⎕FMT sn),' S '
 : EndIf
∇

Kazanan bir kriter belirtmedim, bu yüzden APL hakkında bana en çok öğreteni geriye dönük olarak seçeceğim.
Ben Jackson

@BenJackson Challenges, nesnel bir kazanma kriteri gerektirir. Kullandığınız [code-challenge] etiketinin açıklamasına bakın.
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

gereksinimleri karşılar, ancak düğmelere (örneğin "860S" ve "900S") tam olarak 60 saniye özel bir durum olarak girerim.

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

Çıktı

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

yakut

#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

Uyarılar:

  • İle başlayın ruby program-my-microwave-oven.rbve birim testi değerlendirilir.
  • İle başlayın ruby program-my-microwave-oven.rb 10:00ve yazıyor960S

Kurallar hakkında bazı açıklamalar (ve benim yorumum):

  • En kısa 10:00olanı 960S(9 dakika ve 60 saniye -> 10 dakika).
  • En kısa 10:39olanı 999S(9 dakika ve 99 saniye -> 10 dakika ve 39 saniye).
  • için 4:00bu tercih ++++(daha az parmak hareketleri)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.