"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Contém alguns imprimíveis. Experimente online!
Contagens: 13 bytes de dados compactados, 9 bytes para descompactá-los e 21 bytes para formar a saída.
Explicação
Código não destruído:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Existem exatamente 4 possibilidades de linhas diferentes: ( #
representa um dígito)
#
#
# #
###
Assim, cada número pode ser armazenado como um conjunto de cinco dígitos de base 4. Como cada número pode ser armazenado em 10 bits, o total é de 100 bits, o que corresponde a 13 bytes. Vou pular o processo de compactação e explicar a descompactação.
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.
Após a descompactação, a cadeia compactada de 13 bytes fica assim:
3131332333332111200122213333313321011121213133133133
Observe que isso falharia se qualquer uma das execuções de quatro dígitos 0
fosse iniciada , pois os zeros à esquerda seriam deixados de fora quando s4
executados. Podemos consertar isso tendo 0
represent #
, que aparece apenas três vezes, e nenhum deles cai no início de uma execução de quatro dígitos.
s2 // Slice off the first two chars of the result.
Ok, então, para fazer com que nossa string de 50 dígitos seja compactada bem em pedaços de 4, tivemos que adicionar dois dígitos extras. Adicioná-los ao início da string significa que podemos cortá-los com o one-byter ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Embaraçosamente, o Japt não possui um built-in para dividir uma string em fatias de comprimento X. No entanto, ele possui um built-in para obter todos os caracteres X, para que possamos armazenar todos os dados codificando todas as linhas principais primeiro, depois todas as segundas linhas etc.
Então agora temos a sequência de 5 dígitos que codifica o dígito que queremos criar, por exemplo, 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 o número mágico, consulte as quatro linhas distintas. Se você substituir #
por 1
e
com 0
, obtém
100
001
101
111
Transpor isso e depois juntar-se a uma única string nos dá 101100010111
. Converta em decimal e, voilà, você tem 2839. A reversão do processo mapeia os dígitos0123
nas quatro linhas binárias mostradas acima.
Quase pronto! Agora tudo o que resta a fazer é adicionar os espaços e dígitos:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
E pronto, a saída implícita cuida do resto. Sinto muito que essa explicação seja longa, mas não vejo nenhuma maneira real de jogar golfe sem torná-la menos compreensível (se for compreensível ...)