전자 레인지 프로그래밍 [닫기]


12

나는 매우 게으르다 그래서 나는 가능한 최소한의 버튼 누름으로 마이크로파 를 항상 프로그래밍 하려고 노력한다 . 내 전자 레인지에는 다음과 같은 버튼이 있습니다.

  • "먼저 더하기"버튼은 먼저 눌러야하며 "시작"을 의미합니다. 몇 분 동안 여러 번 누를 수 있지만 수동으로 입력 한 시간에는 1 분이 추가 되지 않습니다 . 산출+
  • 0-9 버튼 세트. 시간 입력은 MMSS입니다 (예 : "130"은 1 분 30 초를 의미). 초의 범위는 0..99입니다. 따라서 "130"과 "90"은 동일한 항목입니다. 항목의 초 부분이 59를 초과하더라도 분명히 분당 60 초입니다. 출력 0..9
  • 시간을 수동으로 입력 한 경우 전자 레인지를 시작하려면이 버튼을 눌러야합니다. 산출S

내 음식 패키지는 시간을 MM : SS로 지정 하므로 프로그램은 해당 입력을 수락해야합니다.

  • 1:00은 +( "minute plus"는 시작을 의미 함)
  • 1:01은 61S(초는 59를 초과 할 수 있지만 "분 더하기"는 숫자와 함께 작동하지 않습니다. 이것이 전자 레인지의 설계 결함이라고 생각합니다)
  • 9:00은 900S(보다 짧음 +++++++++)

6
저녁 식사로 답을 확인할 수 있습니까?
ardnew

1
또한 이는 우선 순위를 갖습니다 : 400S++++?
ardnew

1
@ardnew : 타이 브레이크가 손가락 움직임을 최소화해야한다고 생각합니다 ++++. :)
Ben Jackson

손가락 움직임? 이렇게입니다 888S보다 짧은 928S,하지만 900S보다 짧은 860S? 버튼의 정확한 지오메트리와 각 위치가 필요합니다.
ardnew

4
1:59의 "Pedant 's Meal for One"을 1:59로 전자 레인지로 보내야한다면, ++를 누르고 (1:59를 기다린 후) 1 초 전에 "취소"를 누르십시오. "취소"버튼이 있다고 가정하고 타이머를 쳐다 보는 것이 저렴한 프로세스라고 가정합니다. 다음 식사에서이 옵션을 고려해보십시오! (또는 후속 도전을 위해)
Johno

답변:


3

APL

APL은 읽을 수 없다는 평판이 나쁘지만 골프를 치지 않은 경우에는 그렇지 않습니다.

규칙:

  • 전체 분 <= 4는 +, ++, +++ 및 ++++를 얻습니다.
  • 960-999는 1000-1039보다 선호됩니다. 9960-9999는 10000-10039 등이 바람직합니다.
  • 초가 66, 77, 88 또는 99가되도록 시간을 다시 쓸 수 있으면이 작업이 수행됩니다. (이것은 더 나쁜 해결책을 제공하지 않으며 일반적으로 더 나은 해결책을 제공합니다 (예 : 928 대신 888).)
wave 전자 레인지; 시간; 초; 분; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← '시간을 입력하세요 (m + : ss)'
 시간 ← ⍞
 분 초 ← ⍎¨ (time ≠ ':') ⊂ 시간

minute '분 더하기'는 분 전체에서 사용할 수 있습니다 ≤ 4
 : (secs = 0) ∧ (mins≤4) 인 경우
     ⎕ ← 분 ⍴ '+'
     :반환
 : 끝면
possible 가능하면 초를 60 초 이상 사용하여 키 누르기를 저장하십시오.
분이 10의 거듭 제곱 인 경우 ⍝
 : If (분> 0)
     : ((⌈10⍟ 분) = (⌊10⍟ 분)) ∧ (초 <40)
         ⎕ ← ( 'BI2'⎕FMT 분 -1), (⎕FMT 초 +60),'S '
         :반환
     : 끝면
 : 끝면
f '손가락 움직임'요구 사항에 따라 원하는만큼
press 키를 가능한 한 같은 키로 누르십시오.
⍝ 따라서 888S ipv 928S.
 : 초인 경우 ∊66 77 88 99-60
     ⎕ ← ( 'BI2'⎕FMT 분 -1), (⎕FMT 초 +60),'S '
     :반환
 : 끝면
⍝ 그렇지 않으면 그냥 mmssS를 출력하면 더 나은 대안이 없었습니다.
 : 분> 0 인 경우
    zero 선행 제로 출력 초
     ⎕ ← ( 'BI2'⎕FMT 분), ('G⊂99⊃'⎕FMT 초), 'S'
 :그밖에
    zero 선행 0이 아닌 출력 초만
     ⎕ ← ( 'BI2'⎕FMT 초),'S '
 : 끝면
∇

나는 우승 기준을 지정하지 않았으므로 APL에 대해 가장 많이 가르치는 기준을 소급하여 선택하겠습니다.
벤 잭슨

@BenJackson Challenges에는 객관적인 승리 기준이 필요합니다. 사용한 [code-challenge] 태그에 대한 설명을 참조하십시오.
mbomb007

4

자바 스크립트

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

요구 사항을 충족 하지만 버튼을 입력하는 방법이 아닙니다 (예 : "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:00960S(9 분 60 초-> 10 분)입니다.
  • 가장 짧은 시간 10:39999S(9 분 99 초-> 10 분 39 초)입니다.
  • 4:00선호 하기 때문에 ++++(손가락 움직임이 적음)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.