Japt , 43 bytes
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Contiene algunos no imprimibles. Pruébalo en línea!
Recuento: 13 bytes de datos comprimidos, 9 bytes para descomprimirlos y 21 bytes para formar la salida.
Explicación
Código sin golf:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Hay exactamente 4 posibilidades de fila diferentes: ( #
representa un dígito)
#
#
# #
###
Por lo tanto, cada número se puede almacenar como un conjunto de cinco dígitos de base 4. Como cada número puede almacenarse en 10 bits, el total es de 100 bits, lo que corresponde a 13 bytes. Omitiré el proceso de compresión y en su lugar explicaré la descompresión.
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.
Después de la descompresión, la cadena comprimida de 13 bytes se ve así:
3131332333332111200122213333313321011121213133133133
Tenga en cuenta que esto fallaría si alguna de las ejecuciones de 4 dígitos comenzara 0
, ya que los ceros iniciales se dejarían de lado cuando s4
se ejecute. Podemos arreglar esto al tener 0
representar #
, que solo aparece tres veces, y ninguno de ellos cae al comienzo de una carrera de 4 dígitos.
s2 // Slice off the first two chars of the result.
De acuerdo, para que nuestra cadena de 50 dígitos se comprima bien en trozos de 4, tuvimos que agregar dos dígitos adicionales. Agregarlos al comienzo de la cadena significa que podemos cortarlos con un byte ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
De manera vergonzosa, Japt carece de una función integrada para dividir una cadena en segmentos de longitud X. Sin embargo, tiene una función incorporada para obtener cada carácter Xth, por lo que podemos almacenar todos los datos codificando primero todas las filas superiores, luego todas las segundas filas, etc.
Así que ahora tenemos la cadena de 5 dígitos que codifica el dígito que queremos crear, por ejemplo, 32223
para 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.
Para explicar el número mágico, consulte las cuatro filas distintas. Si reemplazas #
con 1
y
con 0
, obtienes
100
001
101
111
Transponer esto y luego unirnos en una sola cadena nos da 101100010111
. Convierte a decimal y, voilà, tienes 2839. Invertir el proceso asigna los dígitos 0123
en las cuatro filas binarias que se muestran arriba.
¡Casi termino! Ahora todo lo que queda por hacer es agregar los espacios y dígitos:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
Y listo, la salida implícita se encarga del resto. Lamento que esta explicación sea tan larga, pero no veo ninguna forma real de jugar golf sin que sea menos comprensible (si es comprensible ...)