Ich bin ein Zeitreisender, und ich bin besessen vom Lauf der Zeit. Ich mag besonders die Momente, in denen die Uhrzeiger über 12 gehen, wenn ich auf die nächste Seite meines Kalenders blättern kann oder wenn alle "Frohes Neues Jahr!" Rufen.
Bitte schreiben Sie mir ein Programm, das mir in Form eines Fortschrittsbalkens anzeigt, wie weit ich vom letzten Moment bis zum nächsten bin. Wenn ich zum Beispiel sage, dass die Uhrzeit 09:12 Uhr ist, sollte Folgendes gedruckt werden:
09:00 ####---------------- 10:00
Wenn ich sage, dass der Monat Mai 1982 ist, sollte dies gedruckt werden:
1982-01 #######------------- 1983-01
Habe ich erwähnt, dass ich Zeitreisender bin? Ich reise von der ersten Millisekunde von 0 n. Chr. Bis zur letzten Millisekunde von 9999 n. Chr. Überall hin, sodass das Programm jedes Datum und jede Uhrzeit in diesem Bereich verarbeiten muss.
Eingang
Die Eingabe erfolgt in einem der folgenden Formate:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Dies sind die einzigen Formate, die verarbeitet werden müssen. Jeder Teil hat genau die angezeigte Anzahl von Ziffern, was bedeutet, dass Sekundenbruchteile nachgestellte Nullen haben können (z . B.
.120
nie.12
). DiesT
ist ein buchstäblicher Buchstabe "T", der das Datum von der Uhrzeit abgrenzt. Die Öffnungszeiten sind im 24-Stunden-Format.Monate und Tage sind 1-basiert (mehr dazu weiter unten).
Ungültige und außerhalb des Bereichs liegende Eingaben müssen nicht verarbeitet werden.
Nach Ermessen des Programmierers kann die Eingabe eine einzige nachgestellte Zeile enthalten.
Fortschrittsbalken Mathe
Das Programm befasst sich mit den am wenigsten und zweitniedrigsten signifikanten Einheiten in der gegebenen Eingabe. Wenn die Eingabe beispielsweise tagesgenau ist 2016-12-14
, zeigt der Fortschrittsbalken an, wie viel Prozent der Tage im Eingabemonat verstrichen sind und was noch übrig ist.
Der Fortschrittsbalken hat 20 Einheiten (Zeichen) und der dargestellte Anteil wird auf das nächste Inkrement von 1 ⁄ 20 gerundet . Angenommen 2016-12-14T12:28
, der Fortschrittsbalken zeigt Runde ( 28 ⁄ 60 × 20) = 9 von 20 Einheiten "gefüllt".
1-basierte Monate und Tage
Obwohl der Tag vom 1. Dezember (zum Beispiel) ist 01
in 2016-12-01
, für die Zwecke der Berechnung ist es der 0 - ten Tag des Monats, da die abgeschnittenen Einheiten mit der 0 - ten Millisekunde der 0 - ten Minute der 0 - ten Stunde des Tages bedeuten. Mit anderen Worten, 2016-12-01
ist 0 ⁄ 31 des Weges bis Dezember und 2016-12-02
ist 1 ⁄ 31 und so weiter.
Ebenso 2016-01
ist die 0 - ten Millisekunde des 0 - ten Tag des Monats Januar, so in den Berechnungen ist es 0 / 12 , was bedeutet , 2016-12
ist 11 / 12 .
Ja, das bedeutet, dass Monate und Tage den Fortschrittsbalken niemals vollständig ausfüllen.
Unterschiedliche Monatsdauern und Schaltjahre
Verschiedene Monate haben eine unterschiedliche Anzahl von Tagen, und die Ausgabe muss dies widerspiegeln - einschließlich Schaltjahren. Die Fortschrittsanzeige für den 6. Februar 2017 unterscheidet sich von der Fortschrittsanzeige für den 6. Februar 2016 (oder den 6. Januar beider Jahre).
Sonstiges
- Zeitreisende benutzen den proleptischen Gregorianischen Kalender . TL; DR: Keine besonderen Fälle wie fehlende Tage im Jahr 1752 . Die Eingabe umfasst Daten im Jahr 0 n. Chr
- Zeitreisende ignorieren die Sommerzeit.
- Das Programm muss keine Schaltsekunden berücksichtigen, kann es aber.
Ausgabe
Das Programm (oder die Funktion) muss einen horizontal ausgerichteten 20-stelligen Fortschrittsbalken drucken (oder als Zeichenfolge zurückgeben), der für die abgelaufene Zeit "ausgefüllt" und für die verbleibende Zeit "geöffnet" ist. Es muss von links nach rechts "ausfüllen".
Der Fortschrittsbalken muss links eine Beschriftung haben, die den Beginn der zu zählenden Periode anzeigt, und rechts eine Beschriftung, die den Beginn der nächsten Periode im gleichen Format wie die Eingabe anzeigt (jedoch nur zwei Genauigkeitseinheiten). Für unser Beispiel 2016-12-14
wäre die gültige Ausgabe:
12-01 #########----------- 01-01
Hier sind die gültigen Etikettenformate für jeden der möglichen Zeiträume:
- Monate:
YYYY-MM
- Tage:
MM-DD
- Std:
DDThh
- Protokoll:
hh:mm
- Sekunden:
mm:ss
- Millisekunden:
ss.sss
Die Etiketten dürfen keine zusätzlichen Einheiten enthalten, und keine dürfen weggelassen werden.
Notizen ausgeben
- Die "ausgefüllten" Einheiten des Fortschrittsbalkens werden durch ein
#
Zeichen dargestellt. "Offene" Einheiten werden durch dargestellt-
. - Zwischen dem Fortschrittsbalken und jedem Etikett muss genau ein Leerzeichen sein.
- Führende oder nachfolgende Leerzeichen und / oder eine einzelne nachfolgende Zeile sind zulässig.
Gewinnen
Das ist Code-Golf . Kürzester Code in Bytes gewinnt. Es gelten Standardregeln. Standardlücken verboten.
Beispiele
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