In realtà, 58 byte
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Provalo online!
Spiegazione
Ci sono tre parti principali qui, quindi lo analizzerò di conseguenza.
Parte 1: costruzione della stringa base-256
Costruiremo effettivamente la stringa binaria invertita, per sfruttare la struttura stack-based (LIFO) di Actually ed evitare complicazioni con zeri iniziali nella stringa binaria. Pertanto, la stringa binaria di destinazione è 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, che è equivalente a 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
in decimale. In base-256 (utilizzando la tabella dei caratteri CP437 per la conversione), la stringa corrispondente è ♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Per costruire la stringa binaria originale, costruiamo la stringa base-256 (sfruttando il modello in essa) ed eseguiamo conversioni base in decimale e binario.
La stringa base-256 ha il seguente formato (spazi e righe sono stati aggiunti per maggiore chiarezza):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Pertanto, ciascuna delle 7 sezioni centrali può essere formata utilizzando l'impalcatura «%s₧ªn%s6û
e sostituendo le %s
parti con una ≥
o ÷
.
La sequenza specifica di ≥
s e ÷
s abbiamo bisogno è ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Dato che abbiamo bisogno di questo come un elenco di stringhe di lunghezza 1, il modo ingenuo di rappresentarlo sarebbe "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(spingere la stringa, trasformarla in un elenco). Tuttavia, possiamo fare leggermente meglio. Interpretando quella stringa come un numero binario (dove ≥
rappresenta 1
e ÷
rappresenta 0
), si arriva 13542
in decimale. Convertendolo nuovamente in binario (usando i tradizionali 1
s e 0
s) e indicizzandolo in una stringa di lunghezza 2, possiamo ottenere l'elenco usando un byte in meno rispetto al metodo naïve.
: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: conversione in binario
Questa parte è molto più semplice. Se effettivamente avessimo la capacità di convertire direttamente base-256 in binario, lo useremmo. Sfortunatamente, non lo è, quindi dovremo usare il decimale come formato intermedio.
Il ,
seguente codice rappresenta il codice della Parte 1 - a scopo esplicativo, ho sostituito il codice della Parte 1 con ,
per leggere l'output della Parte 1 da STDIN. Non fa parte del codice finale effettivo.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Parte 3: formattazione
Se la sfida consistesse semplicemente nell'output della stringa binaria così com'è, avremmo finito. Tuttavia, abbiamo ancora della formattazione da fare per ottenere la stringa binaria in un rettangolo 21 x 23.
Come nella parte 2, ,
rappresenta l'output della parte precedente e non fa parte del codice effettivo.
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)
Per coloro che tengono traccia a casa, questo è l'equivalente codice Python 3 (481 byte):
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]))