Japt , 43 Bytes
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Enthält einige nicht druckbare Elemente. Probieren Sie es online!
Tallies: 13 Byte komprimierte Daten, 9 Byte zum Dekomprimieren und 21 Byte zum Bilden der Ausgabe.
Erläuterung
Ungolfed-Code:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Es gibt genau 4 verschiedene Zeilenmöglichkeiten: (steht #
für eine Ziffer)
#
#
# #
###
Somit kann jede Nummer als ein Satz von fünf Basis-4-Ziffern gespeichert werden. Da jede Nummer dann in 10 Bit gespeichert werden kann, beträgt die Summe 100 Bit, was 13 Byte entspricht. Ich überspringe den Komprimierungsprozess und erkläre stattdessen die Dekomprimierung.
mZ{Zc s4}
mZ{ } // Replace each character Z in the compressed string with the following:
Zc // Take the char-code of Z.
s4 // Convert to a base-4 string.
Nach der Dekomprimierung sieht die 13-Byte-komprimierte Zeichenfolge folgendermaßen aus:
3131332333332111200122213333313321011121213133133133
Beachten Sie, dass dies fehlschlagen würde, wenn einer der vierstelligen Läufe mit gestartet würde 0
, da die führenden Nullen beim s4
Ausführen weggelassen würden . Wir können dies beheben, indem wir 0
repräsentieren lassen #
, was nur dreimal vorkommt und keines davon zu Beginn eines 4-stelligen Laufs fällt.
s2 // Slice off the first two chars of the result.
Okay, damit unsere 50-stellige Zeichenfolge in 4er-Blöcken komprimiert wird, mussten wir zwei zusätzliche Ziffern hinzufügen. Wenn Sie sie am Anfang der Zeichenfolge einfügen, können Sie sie mit dem Ein-Byte-Befehl abtrennen ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Peinlicherweise verfügt Japt nicht über eine integrierte Funktion zum Aufteilen eines Strings in Segmente der Länge X. Es ist jedoch eine integrierte Funktion zum Abrufen jedes x-ten Zeichens vorhanden, sodass alle Daten gespeichert werden können, indem zuerst alle oberen Zeilen codiert werden alle zweiten Reihen usw.
Jetzt haben wir also die 5-stellige Zeichenfolge, die die zu erstellende Ziffer codiert, z . B. 32223
für 0
.
q mX{2839s2 ë4X} qR
q // Split the resulting string into chars.
mX{ } // Replace each char X with the result of this function:
2839s2 // Convert the magic number 2839 to a binary string.
ë4X // Take every 4th char of this string, starting at index X.
qR // Join the result with newlines.
Um die magische Zahl zu erklären, beziehen Sie sich auf die vier verschiedenen Zeilen. Wenn Sie #
mit 1
und
mit ersetzen 0
, erhalten Sie
100
001
101
111
Wenn wir dies transponieren und dann zu einer einzelnen Zeichenfolge zusammenfügen, erhalten wir 101100010111
. In Dezimalzahl konvertieren und voilà, Sie haben 2839. Beim Umkehren des Prozesses werden die Ziffern 0123
in die vier oben gezeigten Binärzeilen abgebildet.
Fast fertig! Jetzt müssen nur noch die Leerzeichen und Ziffern hinzugefügt werden:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
Um den Rest kümmert sich die implizite Ausgabe. Es tut mir leid, diese Erklärung ist so lang, aber ich sehe keinen wirklichen Weg, um Golf zu spielen, ohne es weniger verständlich zu machen (wenn es verständlich ist ...)