CJam, 77 71 70 69 63 62 bajtów
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Wszystkie znaki można drukować, więc kopiowanie i wklejanie powinno działać dobrze.
Wypróbuj online w interpretatorze CJam .
Pomysł
Zaczynamy od zbadania liczby cyfr n na wejściu i przesunięcia kwadratu spacji wystarczająco dużego, aby pokryć wynik. W realizacji ten kwadrat zostanie zakodowany jako dwuwymiarowa tablica ciągów jednoznakowych.
Kwadrat o długości 2n + 1 byłby w sam raz (tj. Bez otaczających białych znaków) dla prostej implementacji, ale użyjemy jednego o długości 5n, aby zaoszczędzić kilka bajtów. Na szczęście otaczające spacje są dozwolone.
Jeśli odwrócimy linie reprezentacji siedmiu ukośników 8 , otrzymamy:
\/
\/\
/\
Reprezentacja wszystkich cyfr może być zakodowana jako 8-bitowa liczba całkowita, przy czym i- ty bit ma wartość 0, a i- ty znak należy zastąpić spacją. Dla cyfr od 0 do 9 wynikowe liczby całkowite to
247 208 235 250 220 190 191 240 255 254
które odpowiadają następującym znakom ISO-8559-1:
÷Ðëúܾ¿ðÿþ
Dla każdej cyfry w wejściu, po wybraniu odpowiedniej 8-bitową liczbę całkowitą, powtarzamy I th charakteru reprezentacji 8 dokładnie ciągu í czasach, gdzie ja Czy I th bitu liczby całkowitej. To popycha tablicę ciągów jednego lub zera znaków. Dzieląc tę tablicę na części o długości 3, otrzymujemy tablicę, w której każdy element odpowiada linii reprezentacji.
Teraz obliczamy wektoryzowane maksimum łańcuchów reprezentujących kwadrat i łańcuchów reprezentujących cyfrę. Ciągi /
i \
są większe niż ciąg
, więc zastąpią spacje w kwadracie. Pusty ciąg jest jednak mniejszy niż ciąg
, więc puste ciągi w reprezentacji cyfrowej zachowają spacje w kwadracie.
Obracamy teraz wiersze i kolumny o dwie jednostki, aby umieścić następującą cyfrę w odpowiedniej części kwadratu i powtórzyć proces dla pozostałych cyfr na wejściu.
Na koniec odwracamy każdy wiersz i wstawiamy linię między poszczególnymi wierszami.
Kod
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.
Ostatnie obroty zakłóciłyby wynik, gdyby długość boku kwadratu była mniejsza niż 2n + 3 . Ponieważ 5n ≥ 2n + 3 dla wszystkich dodatnich liczb całkowitych n , kwadrat jest wystarczająco duży, aby temu zapobiec.