设置我的微波炉[关闭]


12

我很懒惰,所以我尽量总是用最少的按键编程微波炉。我的微波炉有以下按钮:

  • 一个“分钟加”按钮,只能先按一下,并表示“开始”。可能会多次按下它几分钟,但不会在手动输入的时间上增加一分钟。 输出量+
  • 一组0-9按钮。时间输入为MMSS(即“ 130”表示1分30秒)。秒的范围从0..99。因此,“ 130”和“ 90”是等效的条目。显然,即使输入的秒数部分超过59,每分钟也是60秒。 输出0..9
  • 如果手动输入时间,则必须按下“开始”按钮才能启动微波炉。 输出量S

我的食品包装以MM:SS指定时间,因此程序必须接受该输入。

例子

  • 1:00是+(记住“分钟加”表示开始)
  • 1:01是61S(秒可以超过59,但是“分加”不能与数字结合使用-我认为这是我微波炉的设计缺陷)
  • 9:00是900S(比短+++++++++

6
晚餐会验证答案吗?
ardnew 2012年

1
这也将优先:400S++++
ardnew

1
@ardnew:我猜抢七局应该是最小的手指移动,从而++++胜出。:)
Ben Jackson

手指运动?这样是888S不是更短928S,但900S短于860S?我需要您的按钮及其每个位置的精确几何形状。
ardnew

4
如果我必须以1:59的频率微波处理“ Pedant's Mean for One”,我将按++(等待1:59),然后在结束前一秒钟按“取消”。假设您有一个“取消”按钮,并按下凝视计时器,这是一个廉价的过程,只需按三个按钮即可。也许您可以考虑在以后的饭菜中使用此选项!(或进行后续挑战)
Johno 2012年

Answers:


3

杀伤人员地雷

APL的声誉很差,无法读取,如果不打高尔夫球,则情况并非如此。

规则:

  • 整分钟<= 4得到+,++,+++和++++
  • 高于1000-1039时,最好使用960-999。高于10000-10039时,首选9960-9999,依此类推。
  • 如果可以重写时间,使秒数为66、77、88或99,则可以完成此操作。(这永远不会给出更糟糕的解决方案,通常会提供更好的解决方案,即888而不是928。)
∇微波;时间;秒;分钟; fmt;⎕ML

 ⎕ML←3

 ⎕←'输入时间(m +:ss)'
 时间←⍞
 分钟secs←⍎¨(time≠':')⊂time

⍝“分钟加”仅可用于≤4的整分钟
 :如果(秒= 0)∧(分钟≤4)
     ⎕←分钟⍴'+'
     :返回
 :万一
⍝如有可能,请使用> 60秒来保存按键
⍝如果分钟是10的幂
 :如果(分钟> 0)
     :如果(((⌈10⍟mins)=(⌊10⍟mins))∧(secs <40)
         ⎕←('BI2'⎕FMT分钟-1),(⎕FMT秒+60),'S'
         :返回
     :万一
 :万一
⍝对于“手指运动”要求,我们需要尽可能多的
尽可能多的按键是相同的按键。
因此888S ipv 928S。
 :如果秒∊66 77 88 99-60
     ⎕←('BI2'⎕FMT分钟-1),(⎕FMT秒+60),'S'
     :返回
 :万一
⍝否则,仅输出mmssS,没有其他更好的选择。
 :如果分钟> 0
    ⍝输出秒,前导零
     ⎕←('BI2'⎕FMT分钟),('G⊂99⊃'⎕FMT秒),'S'
 :其他
    ⍝仅输出秒,不带前导零
     ⎕←('BI2'⎕FMT秒),'S'
 :万一
∇

我没有指定获胜标准,所以我将追溯选择一个最能教给我有关APL的知识。
本杰克逊

@BenJackson挑战需要客观的获胜标准。请参阅您使用的[code-challenge]标签的说明。
mbomb007'1

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

佩尔

符合要求,但是这不是我输入按钮的方式(例如“ 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它更喜欢++++(手指动作更少)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.