Мой будильник
Я американец, как и мой (цифровой) будильник. Чтобы установить будильник, он запускается в то время, когда это было ранее. Нажатие на кнопку часов перемещает его вверх на один час, а нажатие на кнопку минут перемещает его на одну минуту вверх. Одновременное нажатие обеих кнопок сбрасывает его до полуночи (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
источник
Ответы:
Шелуха , 16 байт
Попробуйте онлайн!
Принимает аргументы в виде двух списков [часы, минуты], для времени начала и окончания, в 24-часовом формате.
Я очень доволен тем, как много я смог сыграть в эту игру, мне интересно, как аргументы управляются в этой композиции функций.
Функция, которая вычисляет, сколько нажатий клавиш нам нужно, если сброс не разрешен, следующая:
Интересно то, что поскольку остальная часть этого решения может работать только с одним списком в качестве аргумента, этот частично применяется к первому аргументу всей программы, «съедая» его и оставляя только второй аргумент видимым как для себя, так и для себя. остальная часть программы.
Далее мы вычисляем, сколько нажатий клавиш нам нужно, если мы сбрасываем время на 0:00.
Как было сказано ранее, это работает только на втором аргументе (в последний раз) и вычисляется
hours+minutes+2
просто в гольф.Наконец,
§▼
это часть, которая передает второй аргумент обеим функциям и возвращает меньшее из двух результатов.источник
JavaScript (ES6),
7356545250 байтИспользует 24-часовой формат. Вводит в виде 4 целых чисел, представляющих часы и минуты каждого времени.
Попытайся
Введите время в 24-часовом формате с
:
разделителем.объяснение
(Будет обновлено в ближайшее время.)
Функция Анонимный принимает целые числа в качестве аргументов с помощью параметров
g
,l
,h
иm
, гдеg
&l
, соответственно, часы и минуты текущего времени иh
&m
являются часа и минуты заданного времени.Во-первых, мы рассчитываем, сколько нажатий кнопок необходимо, если мы просто сбрасываем часы, а это просто 2 (для сброса) плюс целевой час и целевая минута.
Далее мы рассчитываем, сколько нажатий кнопок необходимо для достижения целевого часа. Мы делаем это, вычитая текущий час из целевого часа. Однако, если текущий час меньше целевого, это даст нам отрицательное число, поэтому мы исправим это, добавив 24, умноженное на проверку if
h<g
(которая возвращает логическое значение, но неявно приводится к целому числу1
, если true, или0
если false с помощью математические операции.Мы используем аналогичную формулу, чтобы вычислить количество нажатий, чтобы получить от текущей минуты до целевой минуты и добавить это к нажатию часа.
Наконец, мы получаем минимум из 2 чисел, чтобы дать нам наш результат.
источник
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 байт
Этот вызов, очевидно, не дает преимуществ языкам игры в гольф, поэтому он такой длинный. С другой стороны, это улучшается благодаря тому, что Pyth основан на Python, поэтому мы можем злоупотреблять его отрицательным модулем.
Тестирование. Числа в Pyth не поддерживают начальные нули.
источник
Желе , 19 байт
Попробуйте онлайн!
Введите как 4 целых числа (конечный час, конечная минута, начальный час, начальная минута)
источник
C # (.NET Core) , 56 байт
Попробуйте онлайн!
Очень похоже на ответ Javascript. Bools в C # не легко конвертировать в числа, поэтому вместо того, чтобы
[diff]+24*(H<h)
я сделал,([diff]+24)%24
что делает то же самое.источник
2+h+m
на -2 байта.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 байт
Довольно просто. Принимает ввод как четыре аргумента, используя 24-часовое время: конечный час, конечную минуту, начальный час, начальную минуту.
источник
Python 3 , 43 байта
Попробуйте онлайн!
Введите как 4 целых числа (начальный час, начальная минута, конечный час, конечная минута)
источник
2 01 11 00
? В своем ответе, как вы определяете, является ли времяAM
илиPM
, если вы не принимаете это в качестве входных данных?13
для этого ввода, используя TIO, который является правильным (сброс + 11 <9 + 59).%
Всегда ли возвращает положительное число в Python?%
.1%24
=1
,1%-24
=-23
. Это очень полезно для этого вопроса.Java 8,
5450 байтПорт ответа @KamilDrakari 's C # (после того, как я сыграл в гольф
26 байт).Объяснение:
Попробуй это здесь.
источник
Perl 5 , 71 +2 (-ap) = 73 байта
Попробуйте онлайн!
Принимает ввод в 24-часовом формате (военное время), разделенном пробелами, время начала первое, время окончания второе: ЧЧ ММ чч мм
источник
Сетчатка , 106 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает ввод как текущее и желаемое время в обычном 24-часовом времени с пробелом, разделяющим два раза. Объяснение:
Преобразовать в одинарный.
Это делает две вещи; он добавляет 24 часа и 60 минут к желаемым часам и минутам, а также добавляет 2 к сумме исходных желаемых часов и минут, т. е. количество нажатий кнопок для установки с помощью сброса.
Вычтите текущие часы из желаемых часов и вычтите 24, которые мы добавили, если сможем.
Аналогично для минут. Это также добавляет два результата вместе.
Если количество нажатий, которое нужно установить с использованием текущего времени, превышает количество нажатий, которое нужно установить с помощью сброса, удалите его.
Преобразуйте первое оставшееся число обратно в десятичное.
источник