โปรแกรมเตาอบไมโครเวฟของฉัน [ปิด]


12

ฉันขี้เกียจมากดังนั้นผมจึงพยายามที่จะเสมอโปรแกรมไมโครเวฟของฉันที่มีน้อยที่สุดกดปุ่มที่เป็นไปได้ ไมโครเวฟของฉันมีปุ่มต่อไปนี้:

  • ปุ่ม "นาทีบวก" ซึ่งสามารถกดได้ก่อนเท่านั้นและหมายถึง "เริ่มต้น" อาจกดหลายครั้งหลายนาที แต่จะไม่เพิ่มหนึ่งนาทีในเวลาที่ป้อนด้วยตนเอง เอาท์พุต+
  • ชุดของปุ่ม 0-9 เวลาเข้าคือ MMSS (เช่น "130" หมายถึง 1 นาที 30 วินาที) วินาทีอาจมีตั้งแต่ 0..99 ดังนั้น "130" และ "90" จึงเป็นรายการที่เทียบเท่ากัน เห็นได้ชัดว่าแต่ละนาทีคือ 60 วินาทีแม้ว่าส่วนวินาทีของรายการเกิน 59 เอาท์พุท0..9
  • ปุ่ม "เริ่มต้น" ซึ่งจะต้องกดเพื่อเริ่มต้นไมโครเวฟหากป้อนเวลาด้วยตนเอง เอาท์พุตS

แพ็คเกจอาหารของฉันระบุเวลาเป็น MM: SSและดังนั้นโปรแกรมต้องยอมรับอินพุตนั้น

ตัวอย่าง

  • 1:00 คือ+(โปรดจำไว้ว่า "นาทีบวก" หมายถึงการเริ่มต้น)
  • 1:01 คือ61S(วินาทีสามารถเกิน 59 แต่ "นาทีบวก" ไม่ทำงานร่วมกับตัวเลข - ฉันคิดว่านี่เป็นข้อบกพร่องในการออกแบบในไมโครเวฟของฉัน)
  • 9:00 คือ900S(สั้นกว่า+++++++++)

6
คำตอบจะถูกตรวจสอบกับอาหารค่ำของคุณ?
ardnew

1
ซึ่งจะมีความสำคัญ: 400Sหรือ++++?
ardnew

1
@ardnew: ฉันเดา tiebreak ควรมีการเคลื่อนไหวนิ้วขั้นต่ำจึง++++ชนะ :)
Ben Jackson

การเคลื่อนไหวนิ้ว? เพื่อให้เป็น888Sที่สั้นกว่า928Sแต่900Sสั้นกว่า860S? ฉันจะต้องใช้รูปทรงเรขาคณิตที่แม่นยำของปุ่มของคุณและตำแหน่งแต่ละตำแหน่ง
ardnew

4
ถ้าฉันต้องไมโครเวฟ "มื้ออาหารของ Pedant หนึ่ง" เป็นเวลา 1:59 น. ฉันจะกด ++ (รอ 1:59) จากนั้นกด "ยกเลิก" หนึ่งวินาทีก่อนที่จะสิ้นสุด กดปุ่มสามปุ่มสมมติว่าคุณมีปุ่ม "ยกเลิก" และพิจารณายืนจ้องมองที่ตัวจับเวลาเพื่อให้กระบวนการถูก บางทีคุณอาจจะพิจารณาตัวเลือกนี้สำหรับมื้ออาหารที่ตามมา! (หรือสำหรับความท้าทายที่ตามมา)
Johno

คำตอบ:


3

APL

APL มีชื่อเสียงที่ไม่ดีซึ่งไม่สามารถอ่านได้ซึ่งไม่ใช่กรณีโดยสิ้นเชิง

กฎระเบียบ:

  • ทั้งนาที <= 4 รับ +, ++, +++ และ ++++
  • 960-999 เป็นที่ต้องการมากกว่า 1,000-1039 9960-9999 ต้องการมากกว่า 10,000-10039 เป็นต้น
  • หากเวลาสามารถเขียนใหม่ได้โดยที่วินาทีคือ 66, 77, 88 หรือ 99 การดำเนินการนี้จะเสร็จสิ้น (สิ่งนี้ไม่เคยให้คำตอบที่แย่กว่าและมักจะให้คำตอบที่ดีกว่าเช่น 888 แทนที่จะเป็น 928)
∇ไมโครเวฟเวลาวินาทีวินาทีนาที fmt ⎕ML

 ⎕ML← 3

 ⎕← 'ป้อนเวลา (m +: ss)'
 เวลา←⍞
 นาทีวินาที←⍎¨ (เวลา≠ ':') ⊂เวลา

minute 'นาทีบวก' สามารถใช้ได้กับทั้งนาที≤ 4 เท่านั้น
 : ถ้า (วินาที = 0) ∧ (ขั้นต่ำ≤4)
     ⎕←mins⍴ '+'
     : การกลับมา
 : EndIf
possible หากเป็นไปได้ให้บันทึกปุ่มกดโดยใช้วินาที> 60
⍝ถ้านาทีเป็นพลังของสิบ
 : ถ้า (นาที> 0)
     : ถ้า ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (วินาที <40)
         ⎕← ('BI2'⎕FMT mins-1), (⎕FMTวินาที +60),' S '
         : การกลับมา
     : EndIf
 : EndIf
⍝สำหรับความต้องการ 'การเลื่อนนิ้ว' ที่เราต้องการให้มากที่สุด
press ของปุ่มกดเป็นไปได้ที่จะเป็นของปุ่มเดียวกัน
888 ดังนั้น 888S ipv 928S
 : ถ้า secs∊66 77 88 99-60
     ⎕← ('BI2'⎕FMT mins-1), (⎕FMTวินาที +60),' S '
     : การกลับมา
 : EndIf
⍝ไม่เช่นนั้นเพียงแค่เอาต์พุต mmssS ไม่มีทางเลือกอื่นที่ดีกว่า
 : ถ้านาที> 0
    ⍝วินาทีเอาต์พุตที่มีศูนย์นำหน้า
     ⎕← ('BI2'⎕FMTนาที), (' G⊂99⊃'⎕FMTวินาที), 'S'
 :อื่น
    output วินาทีเอาต์พุตเท่านั้นไม่ใช่ศูนย์นำหน้า
     ⎕← ('BI2'⎕FMTวินาที),' S '
 : EndIf
∇

ฉันไม่ได้ระบุเกณฑ์การชนะดังนั้นฉันจะเลือกย้อนหลังที่สอนฉันเกี่ยวกับ APL ให้มากที่สุด
Ben Jackson

@BenJackson Challenges ต้องการเกณฑ์การชนะอย่างมีวัตถุประสงค์ ดูรายละเอียดของแท็ก [ท้าทายรหัส] ที่คุณใช้
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

ตรงตามข้อกำหนดแต่ไม่ใช่วิธีที่ฉันจะใส่ปุ่ม (เช่น "860S" เทียบกับ "900S")จัดการกับ 60 วินาทีเป็นกรณีพิเศษ

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

เอาท์พุต

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

ทับทิม

#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

หมายเหตุ:

  • เริ่มต้นด้วยruby program-my-microwave-oven.rbและมีการประเมินการทดสอบหน่วย
  • เริ่มด้วยruby program-my-microwave-oven.rb 10:00และมันเขียน960S

ข้อสังเกตบางประการเกี่ยวกับกฎ (และการตีความของฉัน):

  • สั้นที่สุด10:00คือ960S(9 นาทีและ 60 วินาที -> 10 นาที)
  • สั้นที่สุด10:39คือ999S(9 นาทีและ 99 วินาที -> 10 นาทีและ 39 วินาที)
  • เพราะ4:00ชอบ++++(การเคลื่อนไหวของนิ้วน้อย)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.