CJam, 77 71 70 69 63 62 bytes
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Todos os caracteres são imprimíveis, portanto, copiar e colar deve funcionar perfeitamente.
Experimente online no intérprete CJam .
Idéia
Começamos examinando o número de dígitos n na entrada e pressionando um quadrado de espaços grandes o suficiente para cobrir a saída. Na implementação, esse quadrado será codificado como uma matriz bidimensional de cadeias de caracteres de um caractere.
Um quadrado de comprimento 2n + 1 seria o correto (ou seja, nenhum espaço em branco ao redor) para uma implementação direta, mas usaremos um comprimento de 5n para salvar alguns bytes. Felizmente, o espaço em branco circundante é permitido.
Se invertermos as linhas da representação de sete barras de 8 , obteremos o seguinte:
\/
\/\
/\
A representação de todos os dígitos podem ser codificado como um inteiro de 8 bits, onde o i th bit é 0 sse o i th personagem deve se substituído por um espaço. Para os dígitos de 0 a 9 , os números inteiros resultantes são
247 208 235 250 220 190 191 240 255 254
que correspondem aos seguintes caracteres ISO-8559-1:
÷Ðëúܾ¿ðÿþ
Para cada posição na entrada, depois de seleccionar o número inteiro de 8 bit correspondente, repetimos o i th carácter da representação de 8 exactamente um i vezes, onde uma i é o i th bits do número inteiro. Isso empurra uma matriz de seqüências de caracteres de um ou zero caracteres. Ao dividir essa matriz em partes de comprimento 3, obtemos uma matriz em que cada elemento corresponde a uma linha da representação.
Agora, calculamos o máximo vetorizado das strings que representam o quadrado e as strings que representam o dígito. As strings /
e \
são maiores que a string
, portanto, elas substituirão os espaços no quadrado. A cadeia vazia, no entanto, é menor que a cadeia
, portanto, cadeias vazias na representação de dígitos preservarão os espaços no quadrado.
Agora giramos as linhas e colunas por duas unidades para colocar a seguinte representação de dígitos na parte apropriada do quadrado e repetimos o processo para os dígitos restantes na entrada.
Finalmente, invertemos cada linha e inserimos um avanço de linha entre as linhas individuais.
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.
As últimas rotações atrapalhariam a saída se o comprimento lateral do quadrado fosse menor que 2n + 3 . Como 5n ≥ 2n + 3 para todos os números inteiros positivos n , o quadrado é grande o suficiente para evitar isso.