Імітуйте мій дурний будильник


25

У мене дурний старий будильник з двома кнопками: hourі minute. hourКнопка збільшує час встановленої сигналізації, а також minuteзбільшення хвилинного час набору сигналу тривоги. Однак деякі розумні дизайнери зрозуміли, що натискання обох кнопок одночасно повинно мати сенс, і вирішили, що натискання hourі minuteодночасне спричинить встановлення тривоги на 12:00 am/ 0:00. Ваше завдання - імітувати таку поведінку.

Завдання

Враховуючи час початку та послідовність станів кнопок, визначте час закінчення.

Починаючи з часу початку, збільшуйте годину на кожне виникнення (1,0), збільшуйте хвилину на кожне виникнення (0,1)і встановлюйте час 0:00для кожного виникнення (1,1). Держави (0,0)слід ігнорувати, оскільки вони не відповідають жодній кнопці.

При додаванні до хвилин і годин, якщо хвилина / година перевищує максимум, встановіть її 0, тобто приріст хвилинного значення 59повинен встановити значення хвилини, 0а при збільшенні годинного значення 23слід встановити значення години 0. Збільшення значень хвилини / години вище їх меж не впливає на інше значення, наприклад збільшення хвилини 10:59урожайності 10:00, не 11:00.

Приклад

Враховуючи час 13:58і кроки введення [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). Це відповідає minuteнатисканню. Час зараз 13:59.
  2. (0,1). Це відповідає minuteнатисканню. Час зараз 13:00.
  3. (0,1). Це відповідає minuteнатисканню. Час зараз 13:01.
  4. (0,0). Це не відповідає жодній кнопці. Час, не зачеплений, зараз13:01
  5. (1,1). Це відповідає обом натиснутим кнопкам. Час зараз 0:00.
  6. (1,0)Це відповідає hourнатисканню. Час зараз 1:00.

Оскільки ми закінчуємо 1:00, це вихід.

I / O

Вхід складається з часу та послідовності станів кнопок. Вихід - одноразовий.

Час введення та час виходу може бути

  • 2-кортеж (hour, minute)або (minute, hour)в - 24годинне часу , наприклад, (13, 30)( hourколивається від 0до 23і minuteзнаходиться в діапазоні від 0до 59)
  • то ж саме, що і попередній , але в - 12годинний часу і булевої am/ pmперемикач ( hourзнаходиться в діапазоні від 0до 11або 12і 1до 11з minuteз 0до 59).
  • кількість хвилин з часу 0:00810 (від 0 до 1439, включно)
  • будь-який інший формат, який кодує ту саму інформацію

Послідовність станів кнопок є поданням списку булевих 2-кортежів, наприклад:

  • список кортежів: [(0,1),(1,0),(0,0),(1,1)]
  • рядок з обмеженням пробілу: "01 10 00 11"
  • рядок: "01100011"
  • у четвертинному: [1,2,0,3]
  • перетворене на ціле число: 99
  • будь-який інший формат, який кодує ту саму інформацію

Випробування

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16



Чи прийнятний формат введення двох наборів даних як одного списку? Наприклад [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Джонатан Аллан

@JonathanAllan Так.
fireflame241

Що означає 1200am у звичайний цифровий час?
Феррібіг

Відповіді:


8

Желе , 13 байт

_`+Ạ}?/%24,60

Спробуйте в Інтернеті!


Зауважте, я не впевнений, що ми можемо просто йти вперед та використовувати цей формат введення (тому я запитав), оскільки OP заявляє: "Послідовність станів кнопок є поданням списку".
Джонатан Аллан

@JonathanAllan якщо так, то ОП прокоментує мою відповідь, але я використовую точний формат, який ви використовували у своєму коментарі ... Іноді ОП лінивий або забув оновити виклик
Ерік Атголфер


6

Желе ,  21  (17?) 19 байт

17 байт? - Якщо формат введення: [[initHour, initMinute], [a1, b1], [a2, b2], ...]прийнятний, ми матимемонадійне посилання та може видалитись W;із початку другого рядка.

Примітка: Зараз це сходиться до відповіді Еріка Аутгольферса Джеллі , тому я більше не хочу турбувати гольф (я цього не бачив) ...

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

Дьядичне посилання, що приймає список початкового часу як цілі числа [hour, minute](24 години) зліва та список кнопок, що [[hourPressed, minPressed], ...]знаходиться праворуч,
що знову повертає список результатів часу як цілі числа [hour, minute](24 години).

Спробуйте в Інтернеті! або побачити набір тестів

Як?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)

-1 байт , замінивши ⁹Ạ¤на Ạ}. Ще -2 для використання дозволеного формату. Нарешті, ще -1, тому що ланцюг перед µсюди називається
діадою

6

Python 2 , 84 75 байт

lambda c,a:reduce(lambda(h,m),(d,e):(d&e)and(0,0)or((h+d)%24,(m+e)%60),a,c)

Спробуйте в Інтернеті!

Функція, яка займає час як кортеж (година, хвилина); виходить таким же чином.


-3 байти, використовуючи all(b)замість b[0]&b[1]:lambda c,a:reduce(lambda t,b:all(b)and((t[0]+b[0])%24,(t[1]+b[1])%60)or(0,0),a,c)
Erik the Outgolfer


lambda(h,m),(d,e):ця схема відповідає в Python !?
Quelklef

5

Сітківка , 75 байт

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

.*,1:1
:

Видаліть усе до включення останнього натискання подвійної кнопки, замінивши його порожнім часом (якщо це остання кнопка).

\d+
$*

Перетворити в одинарне.

O`\D1*

Сортувати хвилини до кінця.

,

Додайте години разом.

1>`:

Додайте хвилини разом, але тримаючи години окремо.

+`1{24}:|:1{60}
:

Скоротіть годину та хвилинну модуль на 24 або 60 відповідно.

(?<=^|:)1*
$.&

Перетворити в десятковий.

\b\d\b
0$&

Відформатувати до двох цифр.


4

Python 3, 135 117 115 байт

-20 байт завдяки Джонатану Фреху

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

Спробуйте в Інтернеті!

Забирає час як список у формі [hour, minute].


Ви можете бути в змозі замінити (m[0]+1)з -~m[0]і if m[0]<23 else 0з *(m[0]<23).
Джонатан Фрех

Також, як bі cзавжди булеві значення, ви можете замінити b+c>1на b&c.
Джонатан Фрех

76 байт (Скорочене посилання, через те, що TIO було великим для вікна для коментарів)
Halvard Hummel


4

JavaScript (ES6), 55 байт

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

Здійснює введення в синтаксис currying, з часом початку у формі масиву [min, hour]та кроками у вигляді четвертинного масиву. Час виходу у тому ж форматі, що і час введення.

Випробування


3

Perl 6 , 40 байт

{.reduce({(@^a Z+@^b)X*!@b.min})Z%24,60}

Спробуйте в Інтернеті!

Знімає список, що містить час початку, після якого натискають кнопку. Повертає час завершення. Часи та кнопки - (hour, minute)пари. 24-годинний час.


3

Perl 5 , 70 байт

69 байт коду + 1 для -nпрапора

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

Спробуйте в Інтернеті!

Формат введення

hh:mm,abcdabcdabcdaddccbbaa

де:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

Проміжки або інші роздільники між пресами незначні.

Пояснення

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24

3

Свіфт , 106 96 байт

-10, завдяки Xcoder

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

Спробуйте на ideone!

Функція прийме початкове значення та масив кортежів та повертає кінцевий час.


96 байт , по друку на STDOUT замість: func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}. Це також позбавляється typealias.
Містер Xcoder

1
До речі, ласкаво просимо до PPCG! Дивовижна перша відповідь.
Містер Xcoder

велике спасибі, насправді я спочатку використав print (), але забув після переключення між різними реалізаціями. Ще раз дякую за вашу допомогу.
Нареш

1

Террапін логотип, 304 байти

Не оптимізовано; багато місця.

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

Приймає список як його перший вхід, а початкову годину + хвилину (окремі введення) як другу та третю відповідно.

Я не можу скопіювати + вставити з логотипу Terrapin, оскільки це пробна версія, так що :(


1

R , 61 байт

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

Приймає в Iякості вектора довжини 2 c(H,M)і Bу вигляді списку довжиною 2-векторів для кнопок, c(H,M). Перебирає B, установка Iв c(0,0)разі , якщо сума 2. Потім він вимикається в кінці. У заголовку також є функція перекладати натискання кнопок у потрібний формат R, якщо ви хочете перевірити їх усі; він приймає масив [(H,M),...]як рядок.

Спробуйте в Інтернеті!


1

C # (.NET Core) , 93 байти

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

Спробуйте в Інтернеті!

Приймає вхід, як у тринадцять, з 0 == (1,0), 1 == (0,1), 2 == (1,1), а час у масиві з індексом 0 - години та 1 - хвилини. Змінює часовий масив на місці.



0

Математика, 54 байти

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

Анонімна функція. Бере список 2-кортезів як вхідний і повертає 2-кортеж як вихідний.


0

Скала , 116 байт

Тому я просто сприймаю час початку як два перших параметра мого func ( hі m), і я приймаю послідовність введення як масив [Tuple2].

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

Цікаво ... чи слід вважати декларацію func ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={плюс закінчення }) в кількість байтів?

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.