Имитация моего глупого старого будильника

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
fireflame241
источник
Является ли формат ввода двух наборов данных одним списком приемлемым? Например [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Джонатан Аллан
@JonathanAllan Да.
fireflame241
Что означает 12:00 в обычное цифровое время?
Ferrybig

Ответы:

8

Желе , 13 байт

_`+Ạ}?/%24,60

Попробуйте онлайн!

Эрик Outgolfer
источник
Обратите внимание, я не уверен, что мы можем просто пойти дальше и использовать этот формат ввода (поэтому я спросил), так как OP заявляет: «Последовательность состояний кнопок является представлением списка».
Джонатан Аллан
@JonathanAllan, если так, то OP прокомментирует мой ответ, но я использую точный формат, который вы использовали в своем комментарии ... иногда OP
опаздывает или
6

C 89 87 байт

Спасибо @Jonathan Frech за сохранение двух байтов!

f(h,m,s)char*s;{for(;*s;++s)*s++&1?*s&1?h=m=0:++h:*s&1&&++m;printf("%d %d",h%24,m%60);}

Попробуйте онлайн!

Steadybox
источник
6

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

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

Примечание: это теперь сходится к ответу Эрика «Outgolfers Jelly» , поэтому я больше не буду беспокоиться о гольфе (я этого не видел) ...

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)
Эрик Outgolfer
73 байта
Halvard Hummel
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].

LyricLy
источник
Вы можете быть в состоянии заменить (m[0]+1)с -~m[0]и if m[0]<23 else 0с *(m[0]<23).
Джонатан Фрех,
Кроме того, поскольку bи cвсегда являются булевыми значениями, их можно заменить b+c>1на b&c.
Джонатан Фрех,
76 байт (укороченная ссылка, поскольку
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]

Принимает ввод в синтаксисе карри со временем запуска в виде массива [min, hour] и шагами в виде четвертичного массива. Время вывода в том же формате, что и время ввода.

Тестовые случаи

Джастин Маринер
источник
3

Perl 6 , 40 байт

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

Попробуйте онлайн!

Принимает список, содержащий время начала, после которого нажимаются кнопки. Возвращает время окончания. Времена и кнопки являются (hour, minute)парами. 24-часовое время

nwellnhof
источник
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
Xcali
источник
3

Swift , 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!

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

Naresh
источник
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.
Мистер Кскодер
1
Кстати, добро пожаловать в PPCG! Удивительный первый ответ.
Мистер Кскодер
Большое спасибо, на самом деле я сначала использовал print () ... но я забыл после переключения между различными реализациями. Еще раз спасибо за помощь.
Нареш
1

Terrapin Logo, 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),...]в виде строки.

Попробуйте онлайн!

Giuseppe
источник
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 - минутами. Изменяет временной массив на месте.

jkelm
источник
0

Mathematica, 54 байта

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

Анонимная функция. Принимает список из 2 кортежей в качестве входных данных и возвращает 2-кортеж в качестве выходных данных.

LegionMammal978
источник
0

Scala , 116 байт

Поэтому я просто беру время начала в качестве двух первых параметров моего функционала ( 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]={плюс окончание }) в счетчике байтов?

Попробуйте онлайн!

В. Куртуа
источник