CJam, 77 71 70 69 63 62 Bytes
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Alle Zeichen können ausgedruckt werden, sodass Kopieren und Einfügen problemlos funktionieren sollten.
Probieren Sie es online im CJam-Interpreter aus .
Idee
Wir beginnen damit, die Anzahl der Stellen n in der Eingabe zu untersuchen und ein Quadrat mit Leerzeichen zu verschieben, das groß genug ist, um die Ausgabe abzudecken. In der Implementierung wird dieses Quadrat als zweidimensionales Array von Zeichenfolgen mit einem Zeichen codiert.
Ein Quadrat der Länge 2n + 1 wäre für eine einfache Implementierung genau das Richtige (dh kein umgebendes Leerzeichen), aber wir verwenden ein Quadrat der Länge 5n , um ein paar Bytes zu sparen. Glücklicherweise ist das Umgeben von Leerzeichen erlaubt.
Wenn wir die Zeilen der Darstellung mit sieben Schrägstrichen von 8 umkehren , erhalten wir Folgendes:
\/
\/\
/\
Die Darstellung aller Ziffern kann als 8-Bit-Ganzzahl codiert werden, wobei das i- te Bit 0 ist, wenn das i- te Zeichen durch ein Leerzeichen ersetzt werden soll. Für die Ziffern 0 bis 9 sind die sich ergebenden ganzen Zahlen
247 208 235 250 220 190 191 240 255 254
die den folgenden ISO-8559-1-Zeichen entsprechen:
÷Ðëúܾ¿ðÿþ
Für jede Stelle in dem Eingang nach dem entsprechenden 8-Bit - Integer - Auswahl wiederholen wir die i - te Zeichen der Darstellung von 8 genau eine i - mal, wobei a i die i - te Bit der Ganzzahl. Dadurch wird ein Array von Zeichenfolgen mit einem oder null Zeichen verschoben. Durch Aufteilen dieses Arrays in Abschnitte der Länge 3 erhalten wir ein Array, in dem jedes Element einer Zeile der Darstellung entspricht.
Nun berechnen wir das vektorisierte Maximum der Zeichenfolgen, die das Quadrat darstellen, und der Zeichenfolgen, die die Ziffer darstellen. Die Zeichenfolgen /
und \
sind größer als die Zeichenfolge
, sodass sie die Leerzeichen im Quadrat ersetzen. Die leere Zeichenfolge ist jedoch kleiner als die Zeichenfolge
, sodass leere Zeichenfolgen in der Stellendarstellung die Leerzeichen im Quadrat beibehalten.
Wir drehen nun die Zeilen und Spalten um zwei Einheiten, um die folgende Zifferndarstellung im richtigen Teil des Quadrats zu platzieren und wiederholen den Vorgang für die verbleibenden Ziffern in der Eingabe.
Schließlich kehren wir jede Zeile um und fügen einen Zeilenumbruch zwischen den einzelnen Zeilen ein.
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.
Die letzten Umdrehungen würden die Ausgabe durcheinander bringen, wenn die Seitenlänge des Quadrats kleiner als 2n + 3 wäre . Da 5n ≥ 2n + 3 für alle positiven ganzen Zahlen n ist , ist das Quadrat groß genug, um dies zu verhindern.