電子レンジをプログラムする[終了]


12

私はとても怠け者なので、できるだけ少ないボタンを押すだけで電子レンジを常にプログラムしようとします。私の電子レンジには次のボタンがあります。

  • 最初に押すだけで、「開始」を意味する「分プラス」ボタン。数分間、複数回押すことができますが、手動で入力した時間に1分加算されません出力+
  • 0〜9個のボタンのセット。タイムエントリはMMSSです(「130」は1分30秒を意味します)。秒の範囲は0..99です。したがって、「130」と「90」は同等のエントリです。エントリの秒部分が59を超えても、明らかに1分は60秒です出力0..9
  • 時間を手動で入力する場合、電子レンジを開始するために押す必要がある「開始」ボタン。 出力S

私の食品パッケージはMM:SSで時間を指定しているため、プログラムはその入力を受け入れる必要があります。

  • 1:00です+(「分プラス」は開始を意味することに注意してください)
  • 1:01は61S(秒は59を超えることができますが、「分プラス」は数字と連動しません-これは私の電子レンジの設計上の欠陥だと思います)
  • 9:00は900S(より短い+++++++++

6
答えは夕食会で検証されますか?
ardnew

1
また、どちらが優先されます:400Sまたは++++
ardnew

1
@ardnew:タイブレークは最小限の指の動きでなければならないと思うので、++++勝ちます。:)
ベンジャクソン

指の動き?だから、888Sより短いが928S900Sより短い860S?ボタンと各位置の正確なジオメトリが必要になります。
ardnew

4
「Pedant's Meal for One」を1:59の間電子レンジで処理する必要がある場合は、++を押して(1:59を待つ)、終了の1秒前に「キャンセル」を押します。「キャンセル」ボタンがあり、タイマーを見つめることを安価なプロセスと見なすことを前提に、3つのボタンを押します。たぶん、あなたはその後の食事のためにこのオプションを検討することができます!(またはその後の挑戦のため)
ジョノ

回答:


3

APL

APLは判読不能であるという悪い評判がありますが、ゴルフをしていない場合はまったくそうではありません。

ルール:

  • 全体の分<= 4 get +、++、+++、および++++
  • 960〜999は、1000〜1039より上で優先されます。9960-9999は、10000-10039などよりも優先されます。
  • 秒が66、77、88、または99になるように時刻を書き換えることができる場合、これが行われます。(これは決して悪い解決策を与えることはなく、通常は良い解決策、すなわち928ではなく888を提供します。)
∇マイクロ波、時間、秒、分、fmt、⎕ML

 ⎕ML←3

 ⎕← '時間を入力(m +:ss)'
 時間←⍞
 mins secs←⍎¨(time≠ ':')⊂time

⍝「分プラス」は、4分以下でのみ使用できます
 :(secs = 0)∧(mins≤4)の場合
     ⎕←mins⍴ '+'
     :戻る
 :EndIf
possible可能であれば、60秒以上を使用してキー入力を保存します
min minsが10の累乗の場合
 :(mins> 0)の場合
     :If((⌈10⍟mins)=(⌊10⍟mins))∧(secs <40)
         ⎕←( 'BI2'⎕FMTmins-1)、(⎕FMTsecs + 60)、' S '
         :戻る
     :EndIf
 :EndIf
'「指の動き」の要件には、できるだけ多くの
同じキーになるように、可能な限りキーを押します。
⍝888S ipv 928Sです。
 :秒の場合∊66 77 88 99-60
     ⎕←( 'BI2'⎕FMTmins-1)、(⎕FMTsecs + 60)、' S '
     :戻る
 :EndIf
⍝それ以外の場合は、mmssSを出力するだけで、より良い代替手段はありません。
 :mins> 0の場合
    leading先行ゼロ付きの出力秒
     ⎕←( 'BI2'⎕FMT分)、('G⊂99⊃'⎕FMT秒)、 'S'
 :そうしないと
    output先行ゼロなしではなく、出力秒のみ
     ⎕←( 'BI2'⎕FMT秒)、' S '
 :EndIf
∇

私は勝利基準を指定しなかったので、APLについて最も教えてくれる基準を遡及的に選択します。
ベンジャクソン

@BenJacksonチャレンジには、客観的な勝利基準が必要です。使用した[code-challenge]タグの説明を参照してください。
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:00960S(9分60秒-> 10分)です。
  • 最短10:39999S(9分99秒-> 10分39秒)です。
  • 4:00それが好むため++++(指の動きが少ない)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.