Japt , 43 byte
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Contiene alcuni non stampabili. Provalo online!
Tallies: 13 byte di dati compressi, 9 byte per decomprimerlo e 21 byte per formare l'output.
Spiegazione
Codice non golfato:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Esistono esattamente 4 diverse possibilità di riga: ( #rappresenta una cifra)
#
#
# #
###
Pertanto, ogni numero può essere memorizzato come un insieme di cinque cifre di base 4. Poiché ogni numero può quindi essere memorizzato in 10 bit, il totale è 100 bit, che corrisponde a 13 byte. Salterò il processo di compressione e spiegherò invece la decompressione.
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.
Dopo la decompressione, la stringa compressa da 13 byte si presenta così:
3131332333332111200122213333313321011121213133133133
Notare che ciò non avrebbe esito positivo se si iniziasse una delle corse a 4 cifre 0, poiché gli zero iniziali verrebbero interrotti quando s4viene eseguita. Possiamo risolvere questo problema 0rappresentando # , che appare solo tre volte, e nessuno di questi cade all'inizio di una corsa di 4 cifre.
s2 // Slice off the first two chars of the result.
Ok, quindi per far sì che la nostra stringa di 50 cifre si comprimesse bene in blocchi di 4, abbiamo dovuto aggiungere due cifre extra. Aggiungerli all'inizio della stringa significa che possiamo tagliarli con l'uno-byte ¤.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
In modo imbarazzante, Japt non ha un built-in per dividere una stringa in sezioni di lunghezza X. Ha un built-in per ottenere ogni carattere Xth, tuttavia, quindi possiamo archiviare tutti i dati codificando prima tutte le prime righe, quindi tutte le seconde file, ecc.
Quindi ora abbiamo la stringa di 5 cifre che codifica la cifra che vogliamo creare, ad esempio 32223per 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.
Per spiegare il numero magico, fare riferimento alle quattro righe distinte. Se si sostituisce #con 1e con 0, si ottiene
100
001
101
111
Trasporre questo e poi unirci in una singola stringa ci dà 101100010111. Converti in decimale e, voilà, hai 2839. L'inversione del processo mappa le cifre 0123nelle quattro righe binarie mostrate sopra.
Quasi fatto! Ora non resta che aggiungere spazi e cifre:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
E presto, l'output implicito si prende cura di tutto il resto. Mi dispiace che questa spiegazione sia così lunga, ma non vedo alcun modo reale di giocarla senza renderla meno comprensibile (se comprensibile ...)