Na verdade, 58 bytes
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Experimente online!
Explicação
Existem três partes principais aqui, então eu vou decompô-lo adequadamente.
Parte 1: Construindo a sequência base-256
Na verdade, vamos construir a string binária invertida, aproveitar a estrutura baseada em pilha da Actually (LIFO) e evitar complicações com zeros à esquerda na string binária. Portanto, a cadeia binária de destino 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
é equivalente a 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
decimal. Na base-256 (usando a tabela de caracteres CP437 para conversão), a sequência correspondente é ♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Para construir a cadeia binária original, construímos a cadeia base-256 (aproveitando o padrão nela) e executamos conversões básicas em decimal e binário.
A cadeia base-256 tem o seguinte formato (espaços e novas linhas adicionadas para maior clareza):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Assim, cada uma das 7 seções do meio pode ser formada usando o andaime «%s₧ªn%s6û
e substituindo as %s
peças por ≥
ou ÷
.
A sequência específica de ≥
s e ÷
s que precisamos é ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Como precisamos disso como uma lista de strings de comprimento 1, a maneira ingênua de representá-lo seria "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(empurre a string, faça-a em uma lista). No entanto, podemos fazer um pouco melhor. Ao interpretar essa sequência como um número binário (onde ≥
representa 1
e ÷
representa 0
), obtemos o 13542
decimal. Ao converter isso de volta em binário (usando os tradicionais 1
es 0
) e indexar em uma cadeia de comprimento 2, podemos obter a lista usando um byte a menos que o método ingênuo.
:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+
:13542├ push 13542, convert to binary
`≈"÷≥"E`M for each bit:
≈ convert to integer (from string)
"÷≥"E index into "÷≥"
"«%s₧ªn%s6û"7* push the scaffold for the middle section
% old-style Python string formatting to fill in the scaffold
"♠n≥6û"+ prepend the beginning piece
Parte 2: Convertendo em binário
Esta parte é muito mais direta. Se realmente tivesse a capacidade de converter diretamente base-256 em binário, usaríamos isso. Infelizmente, isso não acontece, então teremos que usar decimal como um formato intermediário.
O ,
código a seguir representa o código da Parte 1 - para fins explicativos, substituí o código da Parte 1 por ,
para ler a saída da Parte 1 do STDIN. Não faz parte do código final real.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Parte 3: Formatação
Se o desafio fosse apenas produzir a string binária como está, estaríamos prontos. No entanto, ainda temos alguma formatação a fazer para obter a sequência binária em um retângulo 21 x 23.
Como na Parte 2, o ,
representa a saída da parte anterior e não faz parte do código real.
73*,`' +`M╪♂Σ♂Ri
, output from Part 2
`' o`M insert a space after every character
73* ╪ chunk into 21 pieces
♂Σ concatenate each piece
♂R reverse each piece
i flatten
(implicitly print)
Para aqueles que acompanham em casa, este é o código Python 3 equivalente (481 bytes):
print('\n'.join([''.join(' '+c for c in bin(sum('\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■\xa0'.index(c)*256**i for i,c in enumerate(("♠n≥6û"+("«%s₧ªn%s6û"*7)%tuple("÷≥"[int(b)]for b in bin(13542)[2:]))[::-1])))[2:])[i*42:-~i*42][::-1]for i in range(23)][::-1]))