Я путешественник во времени, и я одержим течением времени. Мне особенно нравятся моменты, когда стрелки часов проходят 12, или когда я переворачиваюсь на следующую страницу моего календаря, или когда все кричат "С Новым годом!"
Пожалуйста, напишите мне программу, которая покажет мне, как далеко я от последнего такого момента до следующего, в форме индикатора выполнения. Например, если я скажу, что время 09:12, оно должно напечатать это:
09:00 ####---------------- 10:00
Если я скажу, что месяц май 1982 года, он должен напечатать это:
1982-01 #######------------- 1983-01
Я упоминал, что я путешественник во времени? Я путешествую в любую точку от первой миллисекунды 0 г. н.э. до последней миллисекунды 9999 г. н.э., поэтому программа должна обрабатывать любую дату и время в этом диапазоне.
вход
Ввод будет в одном из следующих форматов:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Это единственные форматы, которые необходимо обрабатывать. Каждая часть будет иметь точное количество отображаемых цифр, что означает, что дробные секунды могут иметь конечные нули (например
.120
, никогда.12
).T
Является буквальной буквой «Т» , ограничивающая дату от времени. Часы работают круглосуточно.Месяцы и дни основаны на 1 (подробнее об этом ниже).
Неправильные и находящиеся вне диапазона входные данные не должны обрабатываться.
По усмотрению программиста, ввод может иметь один завершающий перевод строки.
Прогресс бар математика
Программа касается наименее и второстепенно значимых единиц в данном входе. Например, если ввод имеет точность на уровне дня (например 2016-12-14
), индикатор выполнения укажет, какая доля дней во входном месяце истекла по сравнению с тем, что осталось.
Индикатор выполнения будет иметь 20 единиц (символов), а представленная пропорция будет округлена до ближайшего приращения 1 ⁄ 20 . Например, с учетом того 2016-12-14T12:28
, индикатор будет показывать раунд ( 28 / 60 × 20) = 9 из 20 единиц "заполнены."
1 на основе месяцев и дней
Хотя день 1 декабря (к примеру) находится 01
в 2016-12-01
, с целью расчета является 0 - й день месяца, потому что укороченные блоки означают 0 - й милисекнду 0 - й минуте 0 - й час дня. Другими словами, 2016-12-01
это 0 / 31 пути до декабря и 2016-12-02
составляет 1 / +31 , и так далее.
Кроме того, 2016-01
это 0th миллисекунду в 0 - й день января, поэтому в расчетах 0 / 12 , что означает , 2016-12
это 11 / 12 .
Да, это означает, что месяцы и дни никогда не будут полностью заполнять индикатор выполнения.
Различная продолжительность месяца и високосные годы
Разные месяцы имеют разное количество дней, и результаты должны отражать это, включая високосные годы. Индикатор выполнения на 6 февраля 2017 г. будет отличаться от индикатора выполнения на 6 февраля 2016 г. (или 6 января обоих лет).
Разнообразный
- Путешественники во времени используют пролептический григорианский календарь . TL; DR: никаких особых случаев, таких как пропущенные дни в 1752 году, нет . На входе будут указаны даты в 0 году нашей эры.
- Путешественники во времени игнорируют летнее время.
- Программа не обязана учитывать високосные секунды, но может.
Выход
Программа (или функция) должна напечатать (или вернуть в виде строки) горизонтально ориентированный 20-символьный индикатор выполнения, который «заполняется» за прошедшее время и «открывается» за оставшееся время. Оно должно «заполняться» слева направо.
Индикатор выполнения должен иметь метку слева, показывающую начало отсчитываемого периода, а другую справа от него, показывающую начало следующего периода, в том же формате, что и ввод (но показывающий только две единицы точности). Для нашего примера 2016-12-14
допустимый результат будет:
12-01 #########----------- 01-01
Вот допустимые форматы меток для каждого из возможных периодов:
- Месяцы:
YYYY-MM
- Дни:
MM-DD
- часы работы:
DDThh
- Минуты:
hh:mm
- секунды:
mm:ss
- миллисекунды:
ss.sss
Никакие дополнительные единицы не могут быть включены в метки, и ни одна не может быть опущена.
Вывод заметок
- «Заполненные» единицы индикатора выполнения будут представлены
#
персонажем. «Открытые» единицы будут представлены-
. - Между индикатором выполнения и каждой меткой должен быть ровно один пробел.
- Допускаются начальные или конечные пробелы и / или один завершающий символ новой строки.
выигрыш
Это код-гольф . Самый короткий код в байтах побеждает. Стандартные правила применяются. Стандартные лазейки запрещены.
Примеры
Input Output
----------------------- -------------------------------------
2016-12-12T12:17 12:00 ######-------------- 13:00
2016-12-12 12-01 #######------------- 01-01
0000-01-01T00:00:00.000 00.000 -------------------- 01.000
0000-01-01T00:00 00:00 -------------------- 01:00
1899-12-31T23 31T00 ###################- 01T00
1899-12-31 12-01 ###################- 01-01
1899-12 1899-01 ##################-- 1900-01
1982-05-15T17:15 17:00 #####--------------- 18:00
1982-05-15T17 15T00 ##############------ 16T00
1982-05 1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999 59.000 #################### 00.000
9999-12 9999-01 ##################-- 10000-01
2000-01-06 01-01 ###----------------- 02-01
2000-02-06 02-01 ###----------------- 03-01
2001-02-06 02-01 ####---------------- 03-01
1742-09-10 09-01 ######-------------- 10-01
Ответы:
JavaScript, 282 байта
Проходит все тесты
Тестовая функция ничего не печатает для прохода, значения для неудачи.
Тестовые случаи:
источник
Pyth, 213 байтов
Мой первый код в Pyth! Вот:
Мой pyth-код тесно связан с моим предыдущим Python-ответом. Вот негольфированная версия с комментариями:
Тестирование нескольких значений легко выполнить, выполнив цикл кода и добавив в конец символ новой строки:
Тогда я побежал
cat testinput | pyth code.pyth > output
иdiff output testoutput
или попробуйте онлайн .источник
Python 2, 371 байт
Этот вызов был удивительно сложным! Казалось, что мне будет чуть меньше 300, пока я не отработаю форматирование выходной строки.
Самое интересное, что мой ответ не использует пакет даты:
источник