Sono un viaggiatore nel tempo e sono ossessionato dal passare del tempo. Adoro particolarmente i momenti in cui le lancette dell'orologio passano 12, o quando riesco a passare alla pagina successiva del mio calendario, o quando tutti urlano "Felice Anno Nuovo!"
Per favore, scrivi per me un programma per mostrarmi quanto sono lontano dall'ultimo momento al successivo, sotto forma di una barra di avanzamento. Ad esempio, se gli dico che l'ora è 09:12, dovrebbe stampare questo:
09:00 ####---------------- 10:00
Se gli dico che il mese è maggio 1982, dovrebbe stampare questo:
1982-01 #######------------- 1983-01
Ho già detto che sono un viaggiatore nel tempo? Viaggio ovunque dal primo millisecondo di 0 d.C. all'ultimo millisecondo di 9999 d.C., quindi il programma deve gestire qualsiasi data e ora in quell'intervallo.
Ingresso
L'input sarà in uno dei seguenti formati:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Questi sono gli unici formati che devono essere gestiti. Ogni parte avrà esattamente il numero di cifre mostrate, il che significa che i secondi frazionari possono avere zero finali (ad esempio
.120
, mai.12
). IlT
è una lettera letterale "T" che delimita la data dal tempo. Le ore sono su un orologio di 24 ore.Mesi e giorni sono basati su 1 (di più su questo di seguito).
Non è necessario gestire input non validi e fuori portata.
A discrezione del programmatore, l'input può avere una sola nuova riga finale.
Barra di avanzamento matematica
Il programma riguarda le unità meno significative e le seconde meno significative nel dato input. Ad esempio, se l'input ha una precisione a livello di giorno (ad es. 2016-12-14
), La barra di avanzamento indicherà la percentuale di giorni trascorsi nel mese di input rispetto a ciò che rimane.
La barra di avanzamento avrà 20 unità (caratteri) e la proporzione rappresentata sarà arrotondata all'incremento più vicino di 1 ⁄ 20 . Ad esempio, dato che 2016-12-14T12:28
la barra di avanzamento mostrerà Round ( 28 ⁄ 60 × 20) = 9 di 20 unità "riempite".
1 mese e giorni
Sebbene il giorno del 1 ° dicembre (per esempio) sia 01
inserito 2016-12-01
, ai fini del calcolo è il 0 ° giorno del mese, poiché le unità troncate implicano il 0o millisecondo del 0o minuto dell'ora 0 del giorno. In altre parole, 2016-12-01
è 0 ⁄ 31 del modo fino a dicembre ed 2016-12-02
è 1 ⁄ 31 e così via.
Allo stesso modo, 2016-01
è il 0 ° millisecondo del 0 ° giorno di gennaio, quindi nei calcoli è 0 ⁄ 12 , il che significa che 2016-12
è 11 ⁄ 12 .
Sì, ciò significa che mesi e giorni non riempiranno mai completamente la barra di avanzamento.
Durata del mese e anni bisestili diversi
Mesi diversi hanno numeri di giorni diversi e l'output deve riflettere questo, inclusi gli anni bisestili. La barra di avanzamento per il 6 febbraio 2017 sarà diversa dalla barra di avanzamento per il 6 febbraio 2016 (o il 6 gennaio di entrambi gli anni).
miscellaneo
- I viaggiatori del tempo usano il proletico calendario gregoriano . TL; DR: nessun caso speciale come giorni mancanti nel 1752 . L'input includerà le date nell'anno 0 d.C.
- I viaggiatori del tempo ignorano l'ora legale.
- Non è necessario che il programma tenga conto dei secondi intercalari, ma potrebbe esserlo.
Produzione
Il programma (o la funzione) deve stampare (o restituire come stringa) una barra di avanzamento di 20 caratteri orientata orizzontalmente che viene "riempita" per il tempo trascorso e "aperta" per il tempo rimanente. Deve "compilare" da sinistra a destra.
La barra di avanzamento deve avere un'etichetta alla sua sinistra che mostra l'inizio del periodo da contare e un'altra alla sua destra che mostra l'inizio del periodo successivo, nello stesso formato dell'input (ma che mostra solo due unità di precisione). Per il nostro esempio un 2016-12-14
output valido sarebbe:
12-01 #########----------- 01-01
Ecco i formati di etichetta validi per ciascuno dei periodi possibili:
- mesi:
YYYY-MM
- giorni:
MM-DD
- Ore:
DDThh
- Minuti:
hh:mm
- secondi:
mm:ss
- millisecondi:
ss.sss
Nessuna unità aggiuntiva può essere inclusa nelle etichette e nessuna può essere omessa.
Note di output
- Le unità "riempite" della barra di avanzamento saranno rappresentate da un
#
personaggio. Le unità "aperte" saranno rappresentate da-
. - Ci deve essere esattamente uno spazio tra la barra di avanzamento e ciascuna etichetta.
- Sono consentiti spazi iniziali o finali e / o una nuova riga finale finale.
vincente
Questo è code-golf . Vince il codice più breve in byte. Si applicano le regole standard. Scappatoie standard vietate.
Esempi
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