Program oven microwave saya [ditutup]


12

Saya sangat malas jadi saya mencoba untuk selalu memprogram microwave saya dengan menekan tombol sesedikit mungkin . Microwave saya memiliki tombol-tombol berikut:

  • Tombol "menit plus" yang hanya dapat ditekan pertama dan menyiratkan "mulai". Mungkin ditekan beberapa kali selama beberapa menit, tetapi itu tidak akan menambah satu menit ke waktu yang dimasukkan secara manual. Keluaran+
  • Satu set tombol 0-9. Entri waktu adalah MMSS (yaitu "130" berarti 1 menit 30 detik). Detik dapat berkisar dari 0,99. Jadi "130" dan "90" adalah entri yang setara. Jelas setiap menit adalah 60 detik bahkan jika bagian detik dari entri melebihi 59. Output 0..9
  • Tombol "mulai" yang harus ditekan untuk memulai microwave jika waktu dimasukkan secara manual. KeluaranS

Paket makanan saya menentukan waktu dalam MM: SS dan karenanya program harus menerima input itu.

Contohnya

  • 1:00 adalah +(ingat "menit plus" berarti mulai)
  • 1:01 adalah 61S(detik dapat melebihi 59, tetapi "menit plus" tidak bekerja bersama dengan angka - Saya pikir ini adalah cacat desain dalam microwave saya)
  • 9:00 adalah 900S(lebih pendek dari +++++++++)

6
apakah jawaban akan diverifikasi dengan makan malam Anda?
ardnew

1
juga yang lebih diutamakan: 400Satau ++++?
ardnew

1
@ardnew: Saya kira tiebreak harus menjadi gerakan jari minimum, sehingga ++++menang. :)
Ben Jackson

gerakan jari? jadi 888Slebih pendek dari 928S, tetapi 900Slebih pendek dari 860S? Saya akan membutuhkan geometri yang tepat dari tombol Anda dan masing-masing posisi mereka.
ardnew

4
Jika saya harus microwave "Pedant's Meal for One" saya untuk 1:59, saya akan menekan ++ (tunggu 1:59) dan kemudian tekan "batalkan" satu detik sebelum akhirnya. Tiga tombol ditekan, dengan asumsi Anda memiliki tombol "batal" dan menganggap berdiri menatap penghitung waktu sebagai proses yang murah. Mungkin Anda bisa mempertimbangkan opsi ini untuk makanan selanjutnya! (Atau untuk tantangan selanjutnya)
Johno

Jawaban:


3

APL

APL memiliki reputasi buruk bahwa itu tidak dapat dibaca, yang sama sekali tidak terjadi jika tidak golf.

Aturan:

  • Seluruh menit <= 4 dapatkan +, ++, +++, dan ++++
  • 960-999 lebih disukai di atas 1000-1039. 9960-9999 lebih disukai di atas 10000-10039, dll.
  • Jika waktu dapat ditulis ulang sedemikian rupa sehingga detiknya adalah 66, 77, 88, atau 99 maka ini selesai. (Ini tidak pernah memberikan solusi yang lebih buruk dan biasanya memberikan yang lebih baik, yaitu 888 bukannya 928.)
∇ Microwave; waktu; dtk; mnt; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Masukkan waktu (m +: dd)'
 waktu ← ⍞
 menit dtk ← ⍎¨ (waktu ≠ ':') ⊂ waktu

⍝ 'menit plus' hanya dapat digunakan pada seluruh menit ≤ 4
 : If (secs = 0) ∧ (mins≤4)
     ⎕ ← mins⍴ '+'
     :Kembali
 :Berakhir jika
⍝ Jika memungkinkan, simpan penekanan tombol dengan menggunakan detik> 60
⍝ jika menit adalah kekuatan sepuluh
 : Jika (menit> 0)
     : If ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (dtk <40)
         ⎕ ← ('BI2'⎕FMT menit-1), (⎕FMT detik + 60),' S '
         :Kembali
     :Berakhir jika
 :Berakhir jika
⍝ Untuk persyaratan 'gerakan jari' kami ingin sebanyak mungkin
⍝ penekanan tombol mungkin dari tombol yang sama.
⍝ Jadi 888S ipv 928S.
 : Jika detik 77 77 88 99-60
     ⎕ ← ('BI2'⎕FMT menit-1), (⎕FMT detik + 60),' S '
     :Kembali
 :Berakhir jika
⍝ Kalau tidak, hanya output mmssS, tidak ada alternatif yang lebih baik.
 : Jika menit> 0
    ⍝ output detik dengan nol di depan
     ⎕ ← ('BI2'⎕FMT mnt), (' G⊂99⊃'⎕FMT dtk), 'S'
 :Lain
    ⍝ hanya menghasilkan detik, bukan dengan nol di depan
     ⎕ ← ('BI2'⎕FMT dtk),' S '
 :Berakhir jika
∇

Saya tidak menentukan kriteria kemenangan, jadi saya akan secara surut memilih salah satu yang paling mengajarkan saya tentang APL.
Ben Jackson

@BenJackson Tantangan membutuhkan kriteria kemenangan yang objektif. Lihat deskripsi tag [tantangan kode] yang Anda gunakan.
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

memenuhi persyaratan, tetapi itu bukan bagaimana saya akan memasukkan tombol (misalnya "860S" vs "900S") menangani tepat 60 detik sebagai kasus khusus

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

Keluaran

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

rubi

#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

Catatan:

  • Mulai dengan ruby program-my-microwave-oven.rbdan tes unit dievaluasi.
  • Mulai dengan ruby program-my-microwave-oven.rb 10:00dan menulis960S

Beberapa komentar tentang aturan (dan interpretasi saya):

  • Yang terpendek 10:00adalah 960S(9 menit dan 60 detik -> 10 menit).
  • Yang terpendek 10:39adalah 999S(9 menit dan 99 detik -> 10 menit dan 39 detik).
  • untuk 4:00itu lebih suka ++++( lebih sedikit gerakan jari)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.