CJam, 77 71 70 69 63 62 байт
r_,5*_Sa*a*\{~"÷Ðëúܾ¿ðÿþ"=i2bS"\/"4*W<+.*3/..e>2fm>2m>}/Wf%N*
Усі символи для друку, тому копіювання та вставка повинні працювати чудово.
Спробуйте його в Інтернеті в інтерпретаторі CJam .
Ідея
Почнемо з вивчення кількості цифр n на вході та висунення квадрата пробілів, достатнього для покриття результатів. У реалізації цей квадрат буде закодований як двовимірний масив односимвольних рядків.
Квадрат довжиною 2n + 1 був би абсолютно правильним (тобто немає навколишнього пробілу) для прямої реалізації, але ми будемо використовувати один довжиною 5n, щоб зберегти пару байтів. На щастя, навколишній пробіл дозволений.
Якщо ми перевернемо рядки семи похилих зображень 8 , отримаємо таке:
\/
\/\
/\
Представлення всіх цифр може бути кодоване як 8-бітове ціле число, де i- й біт дорівнює 0, якщо i- й символ повинен бути замінений пробілом. Для цифр від 0 до 9 отримані цілі числа
247 208 235 250 220 190 191 240 255 254
які відповідають наступним символам ISO-8559-1:
÷Ðëúܾ¿ðÿþ
Для кожної цифри на вході, після вибору відповідного 8-бітного цілого числа, ми повторюємо i- й символ подання 8 рівно a i разів, де a i - i- й біт цілого числа. Це висуває масив рядків або одного, або нульового символів. Розбивши цей масив на шматки довжиною 3, ми отримуємо масив, де кожному елементу відповідає рядок подання.
Тепер ми обчислюємо векторний максимум рядків, що представляють квадрат, і рядки, які представляють цифру. Рядки /
і \
більше, ніж рядок
, тому вони замінять пробіли в квадраті. Однак порожній рядок менший, ніж рядок
, тому порожні рядки в цифровому зображенні збережуть пробіли у квадраті.
Тепер обертаємо рядки та стовпці на дві одиниці, щоб розмістити наступне цифрне представлення у потрібній частині квадрата та повторити процес для решти цифр у введенні.
Нарешті, перевертаємо кожен ряд і вставляємо між окремими рядками підводку рядків.
Код
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.
Останні обертання зіпсують вихід, якщо довжина сторони квадрата буде меншою за 2n + 3 . Оскільки 5n ≥ 2n + 3 для всіх натуральних чисел n , площа є достатньо великою, щоб не допустити цього.