Таблицы времени
На рабочем месте вам часто приходится заполнять табели учета рабочего времени. Эта задача написать код, чтобы помочь этому.
вход
Два раза в слегка нестандартных 12-часовых часах, обозначающих начало и конец дня, разделенных пробелом. Третье число представляет количество минут, затраченных на обед. Например
9:14 5:12 30
Это означает, что вы начали работу в 9:14, закончили работу в 5:12 и заняли 30 минут на обед.
Вы можете предположить, что
- Любое время в первом столбце - с 00:00 (полночь) до 13:00, но не включая 13:00, а любое время во втором столбце - не позднее 13:00 до 23:59.
- Перерыв на обед не дольше рабочего дня!
Формат ввода должен быть таким, как в приведенных примерах.
задача
Ваш код должен прочитать в файл (или стандартный ввод) этих троек, и для каждого из них вывести, как долго вы работали. Этот вывод должен указывать количество часов. Для приведенного выше примера это:
7 часов и 58 минут минус 30 минут, что составляет 7 часов 28 минут.
Выход
Ваш вывод должен указывать (целое) количество часов и минут и не должен содержать более 59 минут. То есть вы не можете вывести 2 часа 123 минуты. Кроме того, ваш код может выводиться в любом удобном для вас формате, удобном для вас.
Примеры
10:00 1:00 30 --> 2hr 30min
12:59 1:00 0 --> 0hr 1min
00:00 11:59 0 --> 23hr 59min
10:00 2:03 123 --> 2hr 0min
:
разграничение времени на 12-часовых часах) добавляет что-то к этому вызову.Ответы:
MATL , 28 байт
Попробуйте онлайн!
источник
"XXhr YYmin"
?Сетчатка 0.8.2 , 83 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразовать ввод в унарный.
Добавьте 12 часов к времени остановки.
Умножьте часы на 60 и прибавьте к минутам.
Вычтите время начала и время перерыва из времени остановки.
Divmod на 60. (Сохраните 5 байтов для более скучного формата вывода.)
источник
Perl 5 -PL,
807471 байтПопробуйте онлайн!
источник
Python 3, 161 байт
Я знаю, что это даже не будет близко к наименьшему, но это читает в файле:
Я чувствую иронию приостановки моего расписания, чтобы сделать это ...
Python 2,7, 133 байта
Спасибо за предложения в комментариях! Переход на python 2.7 экономит еще несколько байтов, потому что по умолчанию используется целочисленное деление:
Тот же самый подход с python3 составляет 135 байтов из-за оператора print и значения по умолчанию для деления с плавающей точкой:
источник
i=int
в начале и изменив третью строку наm=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
map(int,l[:-1].split(':'))
и отбрасывать множественные преобразования в int, сворачивать все в одну строку, заменяя отступы;
и т. Д., Чтобы сэкономить пару байтов. Кроме того, вы можете посетить Советы по игре в гольф на Python , чтобы узнать о некоторых хитрых уловках, обнаруженных другими пользователями за время их игры в гольф :).print(m,m%60)
будет достаточно. (Также обратите внимание на использованиеm%60
вместоm-(m//60*60)
)C 105 байт
Совершенно просто. Попробуйте это онлайн здесь .
Ungolfed:
источник
a,b,c,d;f(e)
вместоa,b,c,d,e;f()
и;printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}
вместо;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
Wolfram Language
125 119111 байт8 байтов сохранено благодаря пользователю 202729
пример
Сокращения здесь не используются, чтобы было легче следовать логике.
Interpreter["Time"][#2 <> "pm"]
интерпретирует как время второй параметр, за которым следует «pm», а именно, в данном случае «4:12 pm», возвращаяTimeObject
соответствующий 16:12.-Interpreter["Time"][# <> "am"])[[1]] - #3/60]
,#3
это третий параметр, а именно 20мин. Знак минус вычитает интервал обеденного часа из времени окончания смены. Он возвращает скорректированное время окончания смены, то есть конец смены, который был бы применим, если бы человек не взял обеденный перерыв.Interpreter["Time"][#]
интерпретирует как время первый параметр, в данном случае «9:00», возвращаяTimeObject
соответствующий 9:00 утра.Вычитая начало смены из скорректированного времени окончания смены, получаем
t
временной интервал, выраженный в часах.IntegerPart[t]
возвращает количество полных отработанных часов.IntegerPart[60 Mod[t,1]], "min"}]
возвращает дополнительные отработанные минуты.источник
Mod[x, 1]
крест.Floor
быть использован дляIntegerPart
?-6hr 52min
для значений выборки, которые я использовал. Мне нужно изучить это, чтобы понять, почему было получено отрицательное значение для часов (и, очевидно, минут).JavaScript,
83 байта76 байтовПросто избавился от внутренней функции снизу раствора (о чем я думал?). Также изменился формат вывода.
Попробуйте онлайн!
СТАРЫЙ: JavaScript,
112 байт,111 байт,110 байт.Объяснение:
Внутри основной функции мы начнем с определения другой, которая поможет нам вычислить минуты заданного времени, добавив 12 часов к параметру часов, если третий параметр верен:
Далее, мы
разделить строку либосовпадаем с числами внутри строки, в результате чего получается массив всех чисел в строке.' '
или':'
Затем мы рассчитываем разницу между временем окончания и временем начала и вычитаем время обеда, используя ранее определенную функцию (при необходимости преобразуя строки в числа).
Наконец, мы создаем строку результата: часы являются целой частью,
r/60
а минуты -r%60
.Попробуйте онлайн!
источник
map
:a=>a.map(...)
. Это добавит 5 байтов к моему ответу. Но я все еще жду ответа OP (или любого другого) на мой комментарий.Python 2 , 100 байт
Попробуйте онлайн!
Полная программа, которая читает несколько строк из текстового файла, как указано OP. Функция, которая просто анализирует одну строку, сохранит дополнительные 10 байтов.
источник
Java 10,
194191 байтВвод / вывод болезнен в Java. Завершает ненормально, когда нет следующей строки ввода для чтения. Попробуйте это онлайн здесь .
Ungolfed:
источник
Красный , 35 байт
Попробуйте онлайн!
Примечание: вывод в формате
hh:mm:ss
источник
R , 97 байт
Попробуйте онлайн!
Для каждой строки возвращается
"hours minutes"
источник
data.frame
сохранить некоторые байты - пока не работает . Но это простое изменение делает :)