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 , квадрат достаточно велик, чтобы предотвратить это.