Я мандрівник у часі, і я одержимий плином часу. Я особливо люблю моменти, коли руки годинника проходять 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
буквальна літера "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
це 0-а мілісекунда 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