In seiner xkcd über das ISO 8601 Standard-Datumsformat schlich sich Randall in eine eher kuriose alternative Notation:
Die großen Zahlen sind alle Ziffern, die im aktuellen Datum in der üblichen Reihenfolge angezeigt werden, und die kleinen Zahlen sind auf 1 basierende Indizes für das Vorkommen dieser Ziffer. So stellt das obige Beispiel dar 2013-02-27
.
Definieren wir eine ASCII-Darstellung für ein solches Datum. Die erste Zeile enthält die Indizes 1 bis 4. Die zweite Zeile enthält die "großen" Ziffern. Die dritte Zeile enthält die Indizes 5 bis 8. Befinden sich in einem Slot mehrere Indizes, werden diese vom kleinsten zum größten Index nebeneinander aufgeführt. Befinden sich höchstens m
Indizes in einem einzelnen Slot (dh auf derselben Ziffer und in derselben Zeile), sollte jede Spalte m+1
Zeichen breit und linksbündig sein:
2 3 1 4
0 1 2 3 7
5 67 8
Siehe auch die Begleitherausforderung für die umgekehrte Konvertierung.
Die Herausforderung
Geben Sie bei einem Datum in der xkcd-Notation das entsprechende ISO 8601-Datum aus ( YYYY-MM-DD
).
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie können davon ausgehen, dass die Eingabe ein beliebiges gültiges Datum zwischen Jahren 0000
und 9999
einschließlich ist.
Die Eingabe enthält keine führenden Leerzeichen. Sie können jedoch davon ausgehen, dass die Zeilen mit Leerzeichen zu einem Rechteck aufgefüllt sind, das höchstens eine nachgestellte Spalte mit Leerzeichen enthält.
Es gelten die Standardregeln für Code-Golf .
Testfälle
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
ist oben2
, also ist die erste Ziffer2
.2
ist oben0
, also ist die zweite Ziffer0
.3
ist oben1
,4
ist oben3
, so dass wir2013
als die ersten vier Ziffern erhalten. Jetzt5
ist unten0
, also ist die fünfte Ziffer0
,6
und7
beide sind unten2
, also sind diese beiden Ziffern2
. Und schließlich8
ist unten7
, so ist die letzte Ziffer8
, und wir enden mit2013-02-27
. (Die Bindestriche sind in der xkcd-Notation enthalten, da wir wissen, an welchen Positionen sie angezeigt werden.)Antworten:
CJam, 35 Bytes
Probieren Sie es hier aus . Es wird erwartet, dass die Eingabezeilen mit Leerzeichen aufgefüllt werden.
Erläuterung
ll
Liest zwei Eingabezeilen und{1$e>}*
führt einen "Scan" für die zweite Zeile durch : Es nimmt alle Präfixe seiner Eingabe und berechnet das Maximum jedes Präfixes. Für die Eingabezeile"0 1 2 7 8"
wird diese gedrückt"0001112227778"
. Unser Stack sieht jetzt so aus:Wir müssen die Werte mithilfe von neu in eine Liste aufnehmen
]
. Dies erfasst auch unsere erste Zeile, so dass wir sie mit rausholen(
, um zu bekommenwie erwartet.
eelee+
Zählt diese Zeile auf, macht dann dasselbe für eine dritte Eingabezeile und verkettet die Ergebnisse, wobei so etwas oben auf dem Stapel verbleibt:Jetzt befindet sich unser Stapel dort,
["0001112227778" X]
woX
sich die oben aufgeführte Liste befindet.Wir drehen jedes Paar in
X
(Wf%
), sortieren die Paare lexikographisch ($
) und lassen die letzten 8 Paare übrig-8>
. Das bringt uns so etwas wie:Dies funktioniert, da bei der Sortierung alle Paare mit Schlüssel
'
(Leerzeichen) in aufsteigender Reihenfolge vor allen Ziffern stehen.Dies sind die " x- Positionen" der Zeichen
12345678
in der ersten und dritten Zeile: Wir müssen nur die Zeichen aus unserer (modifizierten) zweiten Zeile abrufen, die vertikal mit ihnen ausgerichtet sind.Dazu nehmen wir jede Position (
Wf=
) und indexieren in die Zeichenfolge, die wir zuvor erstellt haben (\f=
). Wir haben"20610222"
jetzt auf dem Stapel: Um die Bindestriche hinzuzufügen, teilen wir uns zuerst in Segmente der Länge zwei (2/
), drucken das erste Segment ohne eine neue Zeile ((o
) und verbinden die verbleibenden Segmente mit Bindestrichen ('-*
).EDIT : cooler Scan-Trick, Martin! Vier Bytes gespeichert.
BEARBEITEN 2 : zwei weitere Bytes durch Ersetzen
eelee+
durchl+ee
; dies funktioniert, weil die Linien alle die gleichen Längen haben, und die Liste Indizierung in CJam ist automatisch die Liste Länge Modulo, so dass die Indizesn+0
,n+1
,n+2
... schön Karte zu0
,1
,2
...EDIT 3 : Martin hat im letzten Schritt des Prozesses ein weiteres Byte gespeichert. Nett!
quelle
Pyth,
4843Test Suite
Erfordert das Auffüllen eines Rechtecks mit Leerzeichen.
Ich denke nicht, dass dies der beste Ansatz ist, aber im Grunde wird der mittlere Wert in einer Zeichenfolge in den Index geschrieben, auf die durch den oberen oder unteren Wert hingewiesen wird. Nun, ich hatte wohl genug Zeit, um die meisten offensichtlichen Dinge, die ich gesehen habe, zu golfen. : P
quelle
JavaScript (ES7), 115
Anonyme Funktion. Unter Verwendung von Vorlagenzeichenfolgen gibt es eine Zeilenvorschubzeile, die von Bedeutung ist und in der Bytezahl enthalten ist.
Voraussetzung: Die mittlere Eingabezeile darf nicht kürzer als die erste oder die letzte sein. Diese Anforderung ist erfüllt, wenn die Eingabe mit Leerzeichen aufgefüllt wird, um ein Rechteck zu bilden.
ES6 Version 117 verwendet .map anstelle des Array-Verständnisses
Weniger golfen
Testschnipsel
quelle
Haskell,
125106103 BytesErfordert das Auffüllen mit Leerzeichen zu einem vollen Rechteck.
Anwendungsbeispiel:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Wie es funktioniert:
quelle
JavaScript ES6, 231
Testfälle .
quelle
Perl, 154 Bytes
Ungolfed & erklärt
quelle
JavaScript (ES6), 131 Byte
Erläuterung
Erfordert, dass die Eingabe mit Leerzeichen aufgefüllt wird, um ein Rechteck zu bilden.
Prüfung
Code-Snippet anzeigen
quelle
Powershell, 119 Bytes
Ungolfed-Testskript:
Ausgabe:
quelle
Jelly , 38 Bytes
Probieren Sie es online!
Der Helfer ist nur da, um die Eingabe zu erleichtern. das ist eigentlich ein volles programm. Achten Sie auf Folgendes :
'''
) sowie die Zeilen daneben (zur Verdeutlichung leer).quelle