Оптимизация тревоги


28

Мой будильник

Я американец, как и мой (цифровой) будильник. Чтобы установить будильник, он запускается в то время, когда это было ранее. Нажатие на кнопку часов перемещает его вверх на один час, а нажатие на кнопку минут перемещает его на одну минуту вверх. Одновременное нажатие обеих кнопок сбрасывает его до полуночи (12:00 утра) и считается как два нажатия кнопок.

Когда часы превышают свой предел (12), он сбрасывается до 1 и включает свет AM / PM. Когда минуты превышают свой предел (59), они сбрасываются в 0, не влияя на часы.

Задание

Ваша задача, учитывая время начала и целевое время, вывести оптимальное количество нажатий кнопок, необходимое для установки моего будильника на целевое время.

Вы можете принять участие в любом формате, который вам подходит. Единственные данные, которые нужны вашей программе, - это часы и минуты для обоих входов. Это означает , что вы, к примеру, может принимать данные в миллисекундах с момента эпохи, и извлечение часов и минут, но вы можете не кодировать ничего в год, месяц, второй, и т.д. Обратите внимание , что в то время как вы можете, например, вход с использованием «военное время» (или обычное время для большей части мира), но это не меняет работу моих часов.

Примеры

1:15 pm -> 2:30 am

Вы можете нажать обе кнопки для сброса до 12:00, а затем увеличить до 2:30, что будет 2+2+30 = 34нажатием кнопки. Вы также можете увеличить до 2:30 утра, что будет 13+15 = 28нажатие кнопок. Таким образом, ваш вывод 28.

3:58 am -> 4:02 am

Вы можете сбросить и увеличить, что будет 2+4+2 = 8нажатие кнопок. Вы также можете увеличить, что будет 1+4 = 5нажатием кнопки. Таким образом, ваш вывод 5.

10:55 pm -> 1:00 am

Вы можете сбросить и увеличить, что будет 2+1 = 3нажатие кнопок. Вы также можете увеличить, что будет 3+5=8нажатием кнопки. Таким образом, ваш вывод 3.

1:00 am -> 1:59 pm

Вы можете сбросить и увеличить, но это будет на три нажатия больше, чем просто увеличение. Таким образом, ваш вывод 12+59 = 71.

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

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
Святое дерьмо! Нажатие этих двух кнопок также сбрасывает мой (европейский) будильник на 0:00 ... Все эти годы потратили слишком много раз, нажимая кнопки ... O_o
Arnauld

8
«военное время (или обычное время для большей части мира)» ... термин, который вы ищете, это «24-часовое время».
Якоб

12
@Jakob Нет, термин, который он ищет, это «обычное время». Американцы используют нерегулярное время, нерегулярные даты, нерегулярные единицы и т. Д. И т. Д.
Нил

1
@ StepHen Я нахожусь в Великобритании и понятия не имел, что ты имел в виду под «военным временем», пока Якоб не объяснил это. 24
Даррен Х

Ответы:


5

Шелуха , 16 байт

§▼ṁ→(Σz%e24 60z-

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

Принимает аргументы в виде двух списков [часы, минуты], для времени начала и окончания, в 24-часовом формате.

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

Функция, которая вычисляет, сколько нажатий клавиш нам нужно, если сброс не разрешен, следующая:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

Интересно то, что поскольку остальная часть этого решения может работать только с одним списком в качестве аргумента, этот частично применяется к первому аргументу всей программы, «съедая» его и оставляя только второй аргумент видимым как для себя, так и для себя. остальная часть программы.

Далее мы вычисляем, сколько нажатий клавиш нам нужно, если мы сбрасываем время на 0:00.

ṁ→    take the sum of each element of the list increased by 1

Как было сказано ранее, это работает только на втором аргументе (в последний раз) и вычисляется hours+minutes+2просто в гольф.

Наконец, §▼это часть, которая передает второй аргумент обеим функциям и возвращает меньшее из двух результатов.


8

JavaScript (ES6), 73 56 54 52 50 байт

Использует 24-часовой формат. Вводит в виде 4 целых чисел, представляющих часы и минуты каждого времени.

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • 2 байта сохранены благодаря Арно .

Попытайся

Введите время в 24-часовом формате с :разделителем.

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


объяснение

(Будет обновлено в ближайшее время.)

(g,l,h,m)=>

Функция Анонимный принимает целые числа в качестве аргументов с помощью параметров g, l, hи m, где g& l, соответственно, часы и минуты текущего времени и h& mявляются часа и минуты заданного времени.

2+h+m

Во-первых, мы рассчитываем, сколько нажатий кнопок необходимо, если мы просто сбрасываем часы, а это просто 2 (для сброса) плюс целевой час и целевая минута.

h-g+24*(h<g)

Далее мы рассчитываем, сколько нажатий кнопок необходимо для достижения целевого часа. Мы делаем это, вычитая текущий час из целевого часа. Однако, если текущий час меньше целевого, это даст нам отрицательное число, поэтому мы исправим это, добавив 24, умноженное на проверку if h<g(которая возвращает логическое значение, но неявно приводится к целому числу 1, если true, или 0если false с помощью математические операции.

+m-l+60*(m<l)

Мы используем аналогичную формулу, чтобы вычислить количество нажатий, чтобы получить от текущей минуты до целевой минуты и добавить это к нажатию часа.

Math.min()

Наконец, мы получаем минимум из 2 чисел, чтобы дать нам наш результат.


1
Не могли бы вы сделать (h-g+24)%24+(m-l+60)%60?
Арно

7

Pyth , 29 байт

Этот вызов, очевидно, не дает преимуществ языкам игры в гольф, поэтому он такой длинный. С другой стороны, это улучшается благодаря тому, что Pyth основан на Python, поэтому мы можем злоупотреблять его отрицательным модулем.

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

Тестирование. Числа в Pyth не поддерживают начальные нули.



3

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

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

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

Очень похоже на ответ Javascript. Bools в C # не легко конвертировать в числа, поэтому вместо того, чтобы [diff]+24*(H<h)я сделал, ([diff]+24)%24что делает то же самое.


Вы можете убрать круглые скобки 2+h+mна -2 байта.
Кевин Круйссен

Я создал порт вашего ответа в Java 8 и заметил, что вы можете (H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
Кевин Круйссен,

1
Разве вы не должны это сделать System.Math.Min?
LiefdeWen

3

Haskell, 41 байт

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

Довольно просто. Принимает ввод как четыре аргумента, используя 24-часовое время: конечный час, конечную минуту, начальный час, начальную минуту.


2

Python 3 , 43 байта

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

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

Введите как 4 целых числа (начальный час, начальная минута, конечный час, конечная минута)


@ StepHen Ой. Легко исправить.
HyperNeutrino

Не для2 01 11 00 ? В своем ответе, как вы определяете, является ли время AMили PM, если вы не принимаете это в качестве входных данных?
г-н Xcoder

@ Mr.Xcoder; Я получаю 13для этого ввода, используя TIO, который является правильным (сброс + 11 <9 + 59).
Лохматый

2
%Всегда ли возвращает положительное число в Python?
Лохматый

4
@ Шагги всегда возвращает знак правой стороны %. 1%24= 1, 1%-24= -23. Это очень полезно для этого вопроса.
Стивен

2

Java 8, 54 50 байт

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

Порт ответа @KamilDrakari 's C # (после того, как я сыграл в гольф 2 6 байт).

Объяснение:

Попробуй это здесь.

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5 , 71 +2 (-ap) = 73 байта

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

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

Принимает ввод в 24-часовом формате (военное время), разделенном пробелами, время начала первое, время окончания второе: ЧЧ ММ чч мм


1

Сетчатка , 106 байт

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает ввод как текущее и желаемое время в обычном 24-часовом времени с пробелом, разделяющим два раза. Объяснение:

\d+
$*

Преобразовать в одинарный.

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

Это делает две вещи; он добавляет 24 часа и 60 минут к желаемым часам и минутам, а также добавляет 2 к сумме исходных желаемых часов и минут, т. е. количество нажатий кнопок для установки с помощью сброса.

(1*):(1* )\1(1{24})?
$2

Вычтите текущие часы из желаемых часов и вычтите 24, которые мы добавили, если сможем.

(1*) (1*):\1(1{60})?
$2

Аналогично для минут. Это также добавляет два результата вместе.

(1+)#(?!\1)

Если количество нажатий, которое нужно установить с использованием текущего времени, превышает количество нажатий, которое нужно установить с помощью сброса, удалите его.

\G1

Преобразуйте первое оставшееся число обратно в десятичное.

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