Запрограммируйте мою микроволновую печь [закрыто]


12

Я очень ленив, поэтому я стараюсь всегда программировать микроволновую печь с минимальным количеством нажатий кнопок . Моя микроволновая печь имеет следующие кнопки:

  • Кнопка «минута плюс», которая может быть нажата только первой и подразумевает «запуск». Его можно нажимать несколько раз в течение нескольких минут, но это не добавит минуты к введенному вручную времени. Выход+
  • Набор из 0-9 кнопок. Время ввода MMSS (т. Е. «130» означает 1 минуту 30 секунд). Секунды могут варьироваться от 0 до 99. Таким образом, «130» и «90» являются эквивалентными записями. Очевидно, что каждая минута составляет 60 секунд, даже если секундная часть записи превышает 59. Вывод 0..9
  • Кнопка «Пуск», которую нужно нажать, чтобы запустить микроволновую печь, если время вводится вручную. ВыходS

В моих пакетах с едой время указывается в ММ: СС, поэтому программа должна принять эти данные.

Примеры

  • 1:00 +(помните, «минута плюс» подразумевает начало)
  • 1:01 61S(секунды могут превышать 59, но «минута плюс» не работает в сочетании с цифрами - я думаю, что это ошибка дизайна в моей микроволновой печи)
  • 9:00 900S(короче +++++++++)

6
Будут ли ответы подтверждены вашим ужином?
ardnew

1
также, который имеет приоритет: 400Sили ++++?
ardnew

1
@ardnew: Я думаю, что тай-брейк должен быть минимальным движением пальца, поэтому ++++выигрывает. :)
Бен Джексон,

движение пальцев? так 888Sкороче 928S, но 900Sкороче 860S? Мне нужна точная геометрия ваших кнопок и каждого из их положений.
ardnew

4
Если бы мне приходилось готовить в микроволновой печи «Пищу для одного» в течение 1:59, я нажимал ++ (жду 1:59), а затем нажимал «отмену» за одну секунду до конца. Три нажатия кнопок, при условии, что у вас есть кнопка «отмена» и вы рассматриваете возможность смотреть на таймер как дешевый процесс. Может быть, вы могли бы рассмотреть этот вариант для последующих приемов пищи! (Или для последующего вызова)
Джоно

Ответы:


3

APL

У APL плохая репутация, что она нечитаема, что совсем не так, если не играть в гольф.

Правила:

  • Целые минуты <= 4 get +, ++, +++ и ++++
  • 960-999 является предпочтительным выше 1000-1039. 9960-9999 является предпочтительным выше 10000-10039 и т.д.
  • Если время можно переписать так, чтобы секунды составляли 66, 77, 88 или 99, то это делается. (Это никогда не дает худшего решения и обычно дает лучшее решение, т.е. 888 вместо 928.)
∇ Микроволновая печь; время; секунды; минуты; fmt; ⎕ML

 ⎕ML ← 3

 ⎕ ← 'Введите время (м +: сс)'
 Время ← ⍞
 мин сек сек ← ⍎¨ (время ≠ ':') ⊂ время

Minute «минута плюс» можно использовать только на целых минутах ≤ 4
 : Если (сек = 0) ∧ (мин≤4)
     ⎕ ← mins⍴ '+'
     :Возвращение
 : EndIf
⍝ Если возможно, сохраните нажатие клавиш, используя секунды> 60
⍝ если минута является степенью десяти
 : Если (мин> 0)
     : Если ((⌈10⍟минс) = (⌊10⍟минс)) ∧ (сек <40)
         ⎕ ← ('BI2'⎕FMT мин-1), (⎕FMT сек + 60),' S '
         :Возвращение
     : EndIf
 : EndIf
Requirement Для требования «движения пальцев» мы хотим, чтобы как можно больше
⍝ нажатий клавиш, насколько это возможно, должны быть одной клавиши.
⍝ Так 888S IPV 928S.
 : Если сек∊66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT мин-1), (⎕FMT сек + 60),' S '
     :Возвращение
 : EndIf
⍝ В противном случае, просто выведите mmssS, лучшей альтернативы не было.
 : Если минут> 0
    ⍝ выходные секунды с нулем в начале
     ⎕ ← ('BI2'⎕FMT мин), (' G⊂99⊃'⎕FMT сек), 'S'
 : Else
    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:00IS 960S(9 минут и 60 секунд -> 10 минут).
  • Кратчайшее для 10:39IS 999S(9 минут и 99 секунд -> 10 минут и 39 секунд).
  • для 4:00этого предпочитает ++++(меньше движений пальцев)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.