Je suis un voyageur du temps et je suis obsédé par le passage du temps. J'aime particulièrement les moments où les aiguilles de l'horloge passent à 12, ou quand je peux passer à la page suivante de mon calendrier, ou quand tout le monde crie "Bonne année!"
Veuillez m'écrire un programme pour me montrer à quelle distance je suis du dernier moment à l'autre, sous la forme d'une barre de progression. Par exemple, si je lui dis qu'il est 09h12, il devrait imprimer ceci:
09:00 ####---------------- 10:00
Si je lui dis que le mois est mai 1982, il devrait imprimer ceci:
1982-01 #######------------- 1983-01
Ai-je mentionné que je suis un voyageur du temps? Je voyage n'importe où, de la première milliseconde de 0 à la dernière milliseconde de 9999 AD, donc le programme doit gérer n'importe quelle date et heure dans cette plage.
Contribution
L'entrée sera dans l'un des formats suivants:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Ce sont les seuls formats à gérer. Chaque partie aura exactement le nombre de chiffres indiqué, ce qui signifie que les fractions de seconde peuvent avoir des zéros de fin (par exemple
.120
, jamais.12
). LeT
est une lettre littérale "T" délimitant la date de l'heure. Les heures sont sur une horloge de 24 heures.Les mois et les jours sont basés sur 1 (voir ci-dessous).
Les entrées non valides et hors plage n'ont pas besoin d'être gérées.
À la discrétion du programmeur, l'entrée peut avoir une seule nouvelle ligne de fin.
Barre de progression mathématique
Le programme concerne les unités les moins et les moins significatives de l'entrée donnée. Par exemple, si l'entrée a une précision au niveau du jour (par exemple 2016-12-14
), la barre de progression indiquera quelle proportion des jours du mois d'entrée s'est écoulée par rapport à ce qui reste.
La barre de progression aura 20 unités (caractères) et la proportion représentée sera arrondie à l'incrément le plus proche de 1 ⁄ 20 . Par exemple, étant donné 2016-12-14T12:28
, la barre de progression affichera Round ( 28 ⁄ 60 × 20) = 9 des 20 unités "remplies".
Mois et jours basés sur 1
Bien que le jour du 1er décembre (par exemple) soit 01
entré 2016-12-01
, aux fins du calcul, il s'agit du 0e jour du mois, car les unités tronquées impliquent la 0e milliseconde de la 0e minute de la 0e heure du jour. En d'autres termes, 2016-12-01
c'est 0 ⁄ 31 du chemin jusqu'en décembre et 2016-12-02
est 1 ⁄ 31 , et ainsi de suite.
De même, 2016-01
c'est la 0e milliseconde du 0e jour de janvier, donc dans les calculs c'est 0 ⁄ 12 , ce qui signifie 2016-12
est 11 ⁄ 12 .
Oui, cela signifie que des mois et des jours ne rempliront jamais complètement la barre de progression.
Durée et mois bissextiles différents
Chaque mois a un nombre de jours différent et la sortie doit refléter cela, y compris les années bissextiles. La barre de progression du 6 février 2017 sera différente de la barre de progression du 6 février 2016 (ou du 6 janvier des deux années).
Divers
- Les voyageurs du temps utilisent le calendrier grégorien proleptique . TL; DR: Pas de cas particulier comme les jours manquants en 1752 . L'entrée inclura les dates de l'année 0 après JC
- Les voyageurs temporels ignorent l'heure d'été.
- Le programme n'est pas tenu de prendre en compte les secondes intercalaires, mais il le peut.
Sortie
Le programme (ou la fonction) doit imprimer (ou renvoyer sous forme de chaîne) une barre de progression de 20 caractères orientée horizontalement qui est "remplie" pour le temps écoulé et "ouverte" pour le temps restant. Il doit "remplir" de gauche à droite.
La barre de progression doit avoir une étiquette à sa gauche indiquant le début de la période comptée et une autre à sa droite indiquant le début de la période suivante, dans le même format que l'entrée (mais affichant seulement deux unités de précision). Pour notre exemple, 2016-12-14
une sortie valide serait:
12-01 #########----------- 01-01
Voici les formats d'étiquette valides pour chacune des périodes possibles:
- Mois:
YYYY-MM
- Journées:
MM-DD
- Heures:
DDThh
- Minutes:
hh:mm
- Secondes:
mm:ss
- Millisecondes:
ss.sss
Aucune unité supplémentaire ne peut être incluse dans les étiquettes et aucune ne peut être omise.
Notes de sortie
- Les unités "remplies" de la barre de progression seront représentées par un
#
caractère. Les unités "ouvertes" seront représentées par-
. - Il doit y avoir exactement un espace entre la barre de progression et chaque étiquette.
- Les espaces de début ou de fin et / ou une seule nouvelle ligne de fin sont autorisés.
Gagnant
C'est du code-golf . Le code le plus court en octets gagne. Des règles standard s'appliquent. Failles standard interdites.
Exemples
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