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


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

Что означает 12:00 в обычное цифровое время?
Ferrybig

Ответы:


8

Желе , 13 байт

_`+Ạ}?/%24,60

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


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

@JonathanAllan, если так, то OP прокомментирует мой ответ, но я использую точный формат, который вы использовали в своем комментарии ... иногда OP
опаздывает или


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


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 байт (укороченная ссылка, поскольку
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-часовое время


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

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!

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


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

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


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

Mathematica, 54 байта

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

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


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]={плюс окончание }) в счетчике байтов?

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.