En realidad, 58 bytes
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Pruébalo en línea!
Explicación
Aquí hay tres partes principales, por lo que lo desglosaré en consecuencia.
Parte 1: Construyendo la cadena base-256
Realmente vamos a construir la cadena binaria invertida, para aprovechar la estructura basada en la pila de Actually (LIFO) y evitar complicaciones con ceros iniciales en la cadena binaria. Por lo tanto, la cadena binaria de destino es 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, que es equivalente a 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
en decimal. En base-256 (usando la tabla de caracteres CP437 para la conversión), la cadena correspondiente es ♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Para construir la cadena binaria original, construimos la cadena base-256 (aprovechando el patrón en ella) y realizamos conversiones de base a decimal y binario.
La cadena base-256 tiene el siguiente formato (espacios y líneas nuevas añadidos para mayor claridad):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Por lo tanto, cada una de las 7 secciones intermedias se puede formar usando el andamio «%s₧ªn%s6û
y reemplazando las %s
partes con ≥
o ÷
.
La secuencia específica de ≥
s y ÷
s es que necesitamos ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Como necesitamos esto como una lista de cadenas de longitud 1, la forma ingenua de representar esto sería "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(empujar la cadena, convertirla en una lista). Sin embargo, podemos hacerlo un poco mejor. Al interpretar esa cadena como un número binario (donde ≥
representa 1
y ÷
representa 0
), obtenemos 13542
en decimal. Al convertir esto de nuevo a binario (usando los 1
s y 0
s tradicionales ) e indexarlo en una cadena de longitud 2, podemos obtener la lista usando un byte menos que el método ingenuo.
: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: Convertir a binario
Esta parte es mucho más sencilla. Si realmente tuviera la capacidad de convertir directamente base-256 a binario, lo usaríamos. Desafortunadamente, no es así, así que tendremos que usar decimal como formato intermedio.
El ,
siguiente código representa el código de la Parte 1: para fines explicativos, he reemplazado el código de la Parte 1 ,
para leer la salida de la Parte 1 de STDIN. No es parte del código final real.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Parte 3: Formateo
Si el desafío fuera simplemente generar la cadena binaria tal como está, estaríamos listos. Sin embargo, todavía tenemos que formatear para obtener la cadena binaria en un rectángulo de 21 x 23.
Como en la Parte 2, ,
representa la salida de la parte anterior y no es parte del 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 aquellos que realizan un seguimiento en casa, este es el código equivalente de Python 3 (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]))