CJam, 77 71 70 69 63 62 byte
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Tutti i caratteri sono stampabili, quindi copia e incolla dovrebbero funzionare bene.
Provalo online nell'interprete CJam .
Idea
Iniziamo esaminando il numero di cifre n nell'input e spingendo un quadrato di spazi abbastanza grande da coprire l'output. Nell'implementazione, questo quadrato verrà codificato come una matrice bidimensionale di stringhe di un carattere.
Un quadrato di lunghezza 2n + 1 sarebbe giusto (vale a dire, nessuno spazio bianco circostante) per un'implementazione semplice, ma ne useremo uno di lunghezza 5n per salvare un paio di byte. Per fortuna, è consentito lo spazio bianco circostante.
Se invertiamo le linee della rappresentazione a 7 barre di 8 , otteniamo quanto segue:
\/
\/\
/\
La rappresentazione di tutte le cifre può essere codificato come numero intero a 8 bit, dove l'i esimo bit è 0 se e solo se l'i esimo carattere dovrebbe ottenere sostituito con uno spazio. Per le cifre da 0 a 9 , gli interi risultanti sono
247 208 235 250 220 190 191 240 255 254
che corrispondono ai seguenti caratteri ISO-8559-1:
÷Ðëúܾ¿ðÿþ
Per ogni cifra in ingresso, dopo aver selezionato il corrispondente 8 bit integer, ripetiamo l'i esimo carattere della rappresentazione di 8 esattamente un i tempi, in cui un i è l'i esimo bit del numero intero. Questo spinge una matrice di stringhe di uno o zero caratteri. Dividendo questo array in blocchi di lunghezza 3, otteniamo un array in cui ogni elemento corrisponde a una linea della rappresentazione.
Ora, calcoliamo il massimo vettoriale delle stringhe che rappresentano il quadrato e le stringhe che rappresentano la cifra. Le stringhe /
e \
sono più grandi della stringa
, quindi sostituiranno gli spazi nel quadrato. La stringa vuota, tuttavia, è più piccola della stringa
, quindi le stringhe vuote nella rappresentazione delle cifre manterranno gli spazi nel quadrato.
Ora ruotiamo le righe e le colonne di due unità per posizionare la seguente rappresentazione delle cifre nella parte corretta del quadrato e ripetere il processo per le cifre rimanenti nell'input.
Infine, invertiamo ogni riga e inseriamo un avanzamento riga tra le singole righe.
Codice
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.
Le ultime rotazioni rovinerebbero l'output se la lunghezza del lato del quadrato fosse inferiore a 2n + 3 . Poiché 5n ≥ 2n + 3 per tutti gli interi positivi n , il quadrato è abbastanza grande da impedirlo.