En fait, 58 octets
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Essayez-le en ligne!
Explication
Il y a trois parties principales ici, donc je vais décomposer en conséquence.
Partie 1: Construire la chaîne base-256
Nous allons en fait construire la chaîne binaire inversée, pour tirer parti de la structure LIFO (pile) d'Actually et éviter les complications liées aux zéros non significatifs de la chaîne binaire. Ainsi, la chaîne binaire cible est 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, ce qui équivaut à 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
en décimal. En base 256 (en utilisant la table de caractères CP437 pour la conversion), la chaîne correspondante est ♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Pour construire la chaîne binaire d'origine, nous construisons la chaîne base-256 (en tirant parti du modèle qu'elle contient) et effectuons des conversions de base en décimales et binaires.
La chaîne base-256 a le format suivant (espaces et nouvelles lignes ajoutés pour plus de clarté):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Ainsi, chacune des 7 sections médianes peut être formée en utilisant l'échafaudage «%s₧ªn%s6û
et en remplaçant les %s
pièces par l'un ≥
ou l' autre ÷
.
La séquence spécifique de ≥
s et ÷
s dont nous avons besoin est ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Puisque nous avons besoin de cela comme liste de chaînes de longueur 1, la manière naïve de le représenter serait "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(poussez la chaîne, faites-en une liste). Cependant, nous pouvons faire un peu mieux. En interprétant cette chaîne comme un nombre binaire (où ≥
représente 1
et ÷
représente 0
), nous obtenons 13542
en décimal. En reconvertissant cela en binaire (en utilisant les traditionnels 1
s et 0
s), et en l'indexant dans une chaîne de longueur 2, nous pouvons obtenir la liste en utilisant un octet de moins que la méthode 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
Partie 2: Conversion en binaire
Cette partie est beaucoup plus simple. Si réellement avait la capacité de convertir directement la base 256 en binaire, nous l'utiliserions. Malheureusement, ce n'est pas le cas, nous devrons donc utiliser le format décimal comme format intermédiaire.
Le ,
code ci-dessous représente le code de la partie 1; à des fins d’explication, j’ai remplacé le code de la partie 1 par ,
lire le résultat de la partie 1 à partir de STDIN. Cela ne fait pas partie du code final réel.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Partie 3: Formatage
Si le défi consistait simplement à sortir la chaîne binaire telle quelle, nous aurions terminé. Cependant, nous avons encore du formatage à faire pour obtenir la chaîne binaire dans un rectangle de 21 x 23.
Comme dans la partie 2, le ,
représente la sortie de la partie précédente et ne fait pas partie du code réel.
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)
Pour ceux qui font le suivi chez eux, il s’agit du code Python 3 équivalent (481 octets):
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]))