Chương trình lò vi sóng của tôi [đóng]


12

Tôi rất lười biếng nên tôi cố gắng luôn lập trình lò vi sóng của mình với ít lần nhấn nút nhất có thể . Lò vi sóng của tôi có các nút sau:

  • Nút "phút cộng" chỉ có thể được nhấn trước và ngụ ý "bắt đầu". Nó có thể được nhấn nhiều lần trong nhiều phút, nhưng nó sẽ không thêm một phút vào thời gian nhập thủ công. Đầu ra+
  • Một bộ các nút 0-9. Thời gian nhập là MMSS (tức là "130" có nghĩa là 1 phút 30 giây). Giây có thể dao động từ 0,99. Vì vậy, "130" và "90" là các mục tương đương. Rõ ràng mỗi phút là 60 giây ngay cả khi phần giây của mục nhập vượt quá 59. Kết quả 0..9
  • Nút "bắt đầu" phải được nhấn để khởi động lò vi sóng nếu thời gian được nhập thủ công. Đầu raS

Gói thực phẩm của tôi chỉ định thời gian trong MM: SS và vì vậy chương trình phải chấp nhận đầu vào đó.

Ví dụ

  • 1:00 là +(nhớ "phút cộng" ngụ ý bắt đầu)
  • 1:01 là 61S(giây có thể vượt quá 59, nhưng "phút cộng" không hoạt động cùng với chữ số - Tôi nghĩ đây là một lỗi thiết kế trong lò vi sóng của tôi)
  • 9:00 là 900S(ngắn hơn +++++++++)

6
câu trả lời sẽ được xác minh với bữa ăn tối của bạn?
ardew

1
cũng được ưu tiên: 400Shay ++++?
ardew

1
@ardnew: Tôi đoán tiebreak nên là cử động ngón tay tối thiểu, do đó ++++thắng. :)
Ben Jackson

cử động ngón tay? vậy là 888Sngắn hơn 928S, nhưng 900Sngắn hơn 860S? Tôi sẽ cần hình học chính xác của các nút của bạn và từng vị trí của chúng.
ardew

4
Nếu tôi phải lò vi sóng "Pedant's Meal for One" trong 1:59, tôi sẽ nhấn ++ (đợi 1:59) và sau đó nhấn "hủy" một giây trước khi kết thúc. Ba lần nhấn nút, giả sử bạn có nút "hủy" và coi việc đứng nhìn chằm chằm vào đồng hồ bấm giờ là một quá trình rẻ tiền. Có lẽ bạn có thể xem xét lựa chọn này cho các bữa ăn tiếp theo! (Hoặc cho một thử thách tiếp theo)
Johno

Câu trả lời:


3

APL

APL có tiếng xấu là không thể đọc được, điều này hoàn toàn không xảy ra nếu nó không được đánh gôn.

Những quy định:

  • Toàn bộ phút <= 4 get +, ++, +++ và ++++
  • 960-999 được ưu tiên trên 1000-1039. 9960-9999 được ưu tiên trên 10000-10039, v.v.
  • Nếu thời gian có thể được viết lại sao cho các giây là 66, 77, 88 hoặc 99 thì việc này đã xong. (Điều này không bao giờ đưa ra một giải pháp tồi tệ hơn và thường đưa ra một giải pháp tốt hơn, tức là 888 thay vì 928.)
Lò vi sóng; thời gian; giây; phút; fmt; ML

 ⎕ML ← 3

 ⎕ ← 'Nhập thời gian (m +: ss)'
 thời gian ←
 phút giây ← (thời gian ≠ ':') thời gian

⍝ 'phút cộng' chỉ có thể được sử dụng trên toàn bộ phút 4
 : Nếu (giây = 0) (phút≤4)
     ⎕ ← phút⍴ '+'
     :Trở về
 : End If
Nếu có thể, hãy lưu phím nhấn bằng cách sử dụng giây> 60
Nếu phút là một sức mạnh của mười
 : Nếu (phút> 0)
     : Nếu ((⌈10⍟ phút) = (10⍟ phút)) ∧ (giây <40)
         ⎕ ← ('BI2'⎕FMT phút-1), (FMT giây + 60),' S '
         :Trở về
     : End If
 : End If
Đối với yêu cầu 'chuyển động ngón tay', chúng tôi muốn có nhiều
Trong số các phím nhấn càng tốt có thể là cùng một khóa.
⍝ Vậy 888S ipv 928S.
 : Nếu giây66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT phút-1), (FMT giây + 60),' S '
     :Trở về
 : End If
Nếu không, chỉ cần xuất mmssS, không có lựa chọn nào tốt hơn.
 : Nếu phút> 0
    Giây đầu ra với số 0 đứng đầu
     ⎕ ← ('BI2'⎕FMT phút), (' G⊂99⊃'⎕FMT giây), 'S'
 : Khác
    Chỉ xuất ra giây, không có số 0 đứng đầu
     ⎕ ← ('BI2'⎕FMT giây),' S '
 : End If
∇

Tôi đã không chỉ định một tiêu chí chiến thắng, vì vậy tôi sẽ chọn hồi tố để dạy tôi nhiều nhất về APL.
Ben Jackson

@BenJackson Thách thức đòi hỏi một tiêu chí chiến thắng khách quan. Xem mô tả về thẻ [thử thách mã] bạn đã sử dụng.
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

đáp ứng các yêu cầu, nhưng đó không phải là cách tôi nhập các nút (ví dụ: "860S" so với "900S") xử lý chính xác 60 giây như một trường hợp đặc biệt

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

Đầu ra

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

hồng ngọc

#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

Nhận xét:

  • Bắt đầu với ruby program-my-microwave-oven.rbvà một bài kiểm tra đơn vị được đánh giá.
  • Bắt đầu với ruby program-my-microwave-oven.rb 10:00nó và nó viết960S

Một số nhận xét về các quy tắc (và giải thích của tôi):

  • Thời gian ngắn nhất 10:00960S(9 phút và 60 giây -> 10 phút).
  • Thời gian ngắn nhất 10:39999S(9 phút và 99 giây -> 10 phút và 39 giây).
  • cho 4:00nó thích ++++(cử động ngón tay ít hơn)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.