CJam, 77 71 70 69 63 62 bytes
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Todos los caracteres son imprimibles, por lo que copiar y pegar debería funcionar bien.
Pruébelo en línea en el intérprete de CJam .
Idea
Comenzamos examinando el número de dígitos n en la entrada y presionando un cuadrado de espacios lo suficientemente grande como para cubrir la salida. En la implementación, este cuadrado se codificará como una matriz bidimensional de cadenas de un carácter.
Un cuadrado de longitud 2n + 1 sería correcto (es decir, sin espacios en blanco circundantes) para una implementación sencilla, pero usaremos uno de longitud 5n para guardar un par de bytes. Afortunadamente, se permite el espacio en blanco circundante.
Si invertimos las líneas de la representación de siete barras diagonales de 8 , obtenemos lo siguiente:
\/
\/\
/\
La representación de todos los dígitos se puede codificar como un entero de 8 bits, donde el i- ésimo bit es 0 si el i- ésimo carácter debe reemplazarse con un espacio. Para los dígitos del 0 al 9 , los enteros resultantes son
247 208 235 250 220 190 191 240 255 254
que corresponden a los siguientes caracteres ISO-8559-1:
÷Ðëúܾ¿ðÿþ
Para cada dígito en la entrada, después de seleccionar el entero de 8 bits correspondiente, repetimos el i- ésimo carácter de la representación de 8 exactamente a i veces, donde a i es el i th bit del entero. Esto empuja una serie de cadenas de uno o cero caracteres. Al dividir esta matriz en trozos de longitud 3, obtenemos una matriz donde cada elemento corresponde a una línea de la representación.
Ahora, calculamos el máximo vectorizado de las cadenas que representan el cuadrado y las cadenas que representan el dígito. Las cadenas /
y \
son más grandes que la cadena
, por lo que reemplazarán los espacios en el cuadrado. Sin embargo, la cadena
vacía es más pequeña que la cadena , por lo que las cadenas vacías en la representación de dígitos preservarán los espacios en el cuadrado.
Ahora rotamos las filas y columnas por dos unidades para colocar la siguiente representación de dígitos en la parte adecuada del cuadrado y repetir el proceso para los dígitos restantes en la entrada.
Finalmente, invertimos cada fila e insertamos un salto de línea entre las filas individuales.
Código
r_, e# Read a token from STDIN and push the length of a copy.
5*_ e# Multiply the length by 5 and push a copy.
Sa* e# Repeat the array [" "] that many times.
a* e# Repeat the array [[" " ... " "]] that many times.
\{ e# For each character C in the input:
~ e# Push eval(C), i.e., the digit the character represents.
"÷Ðëúܾ¿ðÿþ"
e# Push the encodings of all 10 seven slash representations.
= e# Select the proper one.
i2b e# Push the resulting characters code point in base 2, i.e., its bits.
S e# Push " ".
"\/"4* e# Push "\/\/\/\/".
+W< e# Concatenate and eliminate the last character.
.* e# Vectorized repetition.
e# For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and " \/\/\/\" on
e# the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].
3/ e# Divide the representation into chunks of length 3, i.e., its lines.
..e> e# Compute the twofold vectorized maximum, as explained above.
2fm> e# Rotate each line to characters to the right.
2m> e# Rotate the lines two units down.
}/
Wf% e# Reverse each line.
N* e# Place linefeeds between them.
Las últimas rotaciones estropearían la salida si la longitud del lado del cuadrado fuera menor que 2n + 3 . Como 5n ≥ 2n + 3 para todos los enteros positivos n , el cuadrado es lo suficientemente grande como para evitar esto.