CJam, 77 71 70 69 63 62 octets
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Tous les caractères sont imprimables, le copier-coller devrait donc fonctionner correctement.
Essayez-le en ligne dans l' interprète CJam .
Idée
Nous commençons par examiner le nombre de chiffres n dans l'entrée et en poussant un carré d'espaces assez grand pour couvrir la sortie. Dans l'implémentation, ce carré sera codé sous la forme d'un tableau à deux dimensions de chaînes à un caractère.
Un carré de longueur 2n + 1 conviendrait parfaitement (c’est-à-dire qu’il n’ya pas d’espace blanc) pour une implémentation simple, mais nous en utiliserons un de longueur 5n pour économiser quelques octets. Heureusement, les espaces blancs environnants sont autorisés.
Si nous inversons les lignes de la représentation sept barres obliques de 8 , nous obtenons ce qui suit:
\/
\/\
/\
La représentation de tous les chiffres peut être codé comme un entier 8 bits, où le i ème bit est 0 ssi le i ème personnage doit me remplacer par un espace. Pour les chiffres de 0 à 9 , les entiers résultants sont
247 208 235 250 220 190 191 240 255 254
qui correspondent aux caractères ISO-8559-1 suivants:
÷Ðëúܾ¿ðÿþ
Pour chaque chiffre dans l'entrée, après avoir sélectionné le nombre entier de 8 bits, on répète le i correspondant ième caractère de la représentation de 8 exactement un i fois, où un i est le i ème bit du nombre entier. Cela pousse un tableau de chaînes de un ou zéro caractères. En divisant ce tableau en morceaux de longueur 3, nous obtenons un tableau où chaque élément correspond à une ligne de la représentation.
Maintenant, nous calculons le maximum vectorisé des chaînes qui représentent le carré et les chaînes qui représentent le chiffre. Les chaînes /
et \
sont plus grandes que la chaîne
, elles vont donc remplacer les espaces dans le carré. Toutefois, la chaîne
vide est plus petite que la chaîne . Par conséquent, les chaînes vides dans la représentation numérique préservent les espaces du carré.
Nous tournons maintenant les lignes et les colonnes de deux unités pour placer la représentation numérique suivante dans la partie appropriée du carré et répétons le processus pour les chiffres restants de l'entrée.
Enfin, nous inversons chaque ligne et insérons un saut de ligne entre les lignes individuelles.
Code
r_, e# Read a token from STDIN and push the length of a copy.
5*_ e# Multiply the length by 5 and push a copy.
Sa* e# Repeat the array [" "] that many times.
a* e# Repeat the array [[" " ... " "]] that many times.
\{ e# For each character C in the input:
~ e# Push eval(C), i.e., the digit the character represents.
"÷Ðëúܾ¿ðÿþ"
e# Push the encodings of all 10 seven slash representations.
= e# Select the proper one.
i2b e# Push the resulting characters code point in base 2, i.e., its bits.
S e# Push " ".
"\/"4* e# Push "\/\/\/\/".
+W< e# Concatenate and eliminate the last character.
.* e# Vectorized repetition.
e# For the digit 5, e.g., we have [1 0 1 1 1 1 1 0] and " \/\/\/\" on
e# the stack, so .* yields [" " "" "/" "\" "/" "\" "/" ""].
3/ e# Divide the representation into chunks of length 3, i.e., its lines.
..e> e# Compute the twofold vectorized maximum, as explained above.
2fm> e# Rotate each line to characters to the right.
2m> e# Rotate the lines two units down.
}/
Wf% e# Reverse each line.
N* e# Place linefeeds between them.
Les dernières rotations gâcheraient la sortie si la longueur du côté du carré était inférieure à 2n + 3 . Puisque 5n ≥ 2n + 3 pour tous les entiers positifs n , le carré est suffisamment grand pour empêcher cela.