Програмуйте мою мікрохвильову піч [закрито]


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: Я вважаю, що тайбрек повинен бути мінімальним рухом пальця, таким чином, ++++виграє. :)
Бен Джексон

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

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

Відповіді:


3

APL

APL має погану репутацію, що вона не читається, що зовсім не так, якщо це не гольф.

Правила:

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

 ⎕ML ← 3

 ⎕ ← 'Введіть час (m +: ss)'
 час ← ⍞
 хвилин секунди ← ⍎¨ (час ≠ ':') ⊂час

⍝ "Хвилинний плюс" можна використовувати лише протягом цілих хвилин ≤ 4
 : Якщо (сек = 0) ∧ (хв .≤4)
     ⎕ ← хв⍴ '+'
     : Повернення
 : EndIf
⍝ Якщо можливо, збережіть натискання клавіші, використовуючи секунди> 60
⍝ якщо хв - потужність десять
 : Якщо (хв.> 0)
     : If ((⌈10⍟mins) = (⌊10⍟mins)) ∧ (secs <40)
         ⎕ ← ('BI2'⎕FMT хв-1), (⎕FMT сек. + 60),' S '
         : Повернення
     : EndIf
 : EndIf
⍝ Для вимоги "руху пальцем" ми хочемо стільки ж
⍝ щонайменше натискання клавіш має однакову клавішу.
⍝ Отже, 888S ipv 928S.
 : Якщо сек. 66 77 88 99-60
     ⎕ ← ('BI2'⎕FMT хв-1), (⎕FMT сек. + 60),' S '
     : Повернення
 : EndIf
⍝ Інакше, тільки вихідний mmssS, не було кращої альтернативи.
 : Якщо хвилин> 0
    ⍝ вихідні секунди з ведучим нулем
     ⎕ ← ('хв. BI2'⎕FMT), (' G⊂99⊃'⎕FMT сек.), 'S'
 : Інше
    ⍝ лише вихідні секунди, а не нульовий нуль
     ⎕ ← ('BI2'⎕FMT сек),' S '
 : EndIf
∇

Я не вказував критеріїв виграшу, тому буду обирати заднім числом той, який мене найбільше навчає про APL.
Бен Джексон

@BenJackson Challenges вимагає об'єктивного критерію виграшу. Дивіться опис використовуваного вами тегу [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:00- 960S9 хвилин і 60 секунд -> 10 хвилин.
  • Найкоротший час 10:39- 999S9 хвилин і 99 секунд -> 10 хвилин і 39 секунд.
  • тому 4:00він віддає перевагу ++++(менше рухів пальцем)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.