05AB1E, 40 39 38 байт
$_=sprintf"b",0xf79ef7dee492f3def39eb792e79ee7ce4924f6de>>16*$_&65535;eval"y/01/ @F/";s/...\K/\n/g
Попробуйте онлайн!
Объяснение
-Mbigint -pa
||answer||
Япт, 43 байта
Ṿ⁶,“SÐ~ẈoI9Ẇ¦Y./,0&Ƥɓ€ọ’ṃs15ị@s3
Содержит некоторые непечатные материалы. Попробуйте онлайн!
Подсчеты: 13 байт сжатых данных, 9 байт для их распаковки и 21 байт для формирования выходных данных.
Объяснение
Негольфированный код:
3
Существует ровно 4 различных варианта строк: ( TT
represents a digit)
→↓←↑
Таким образом, каждое число может быть сохранено как набор из пяти цифр по основанию 4. Поскольку каждое число может быть сохранено в 10 битах, общее количество составит 100 бит, что соответствует 13 байтам. Я пропущу процесс сжатия и вместо этого объясню распаковку.
+
После распаковки 13-байтовая сжатая строка выглядит следующим образом:
→↓←
Обратите внимание, что это не удастся, если какой-либо из 4-значных прогонов начнется с T
, as the leading zeroes would be left off when ↓←
запущен. Мы можем исправить это, имея ¬
represent ↑→
, который появляется только три раза, и ни один из них не попадает в начало 4-значного ряда.
L
Итак, чтобы наша 50-значная строка могла хорошо сжиматься в куски по 4, нам пришлось добавить две дополнительные цифры. Добавление их в начало строки означает, что мы можем отрезать их с помощью однобайтовой ←↑→↓
.
⟦...⟧ Array of paths, see below
N Input as an integer
§ Index into the array
✳✳ Treat the element as direction data
³ Length of each segment (including 1 character overlap)
θ Draw using the input character
GH Draw a path
К сожалению, в Japt нет встроенной функции для разделения строки на фрагменты длиной X. Однако у него есть встроенная функция для получения каждого X-го символа, поэтому мы можем хранить все данные, сначала кодируя все верхние строки, а затем все вторые ряды и т. д.
Итак, теперь у нас есть 5-значная строка, кодирующая цифру, которую мы хотим создать, например. GH✳✳§⟦⟦↑L↓¬⟧⟦↓↓⟧⟦T↓→⟧⟦T→¬⟧⟦↑↑¬↑⟧⟦←↓T⟧⟦T↑L⟧⟦→↓↓⟧⟦+L↓⟧⟦+↓T⟧⟧N³θ
for ?421⎇&IιIλθ
.
E§⪪”{⊞¶↙⬤\→*'K«-aRQ¹νÀ⁰”⁵N
Чтобы объяснить магическое число, вернемся к четырем различным рядам. Если вы замените E§⪪”{⊞¶↙⬤\→*'K«-aRQ¹νÀ⁰”⁵N?421⎇&IιIλθ
with param($n);$a="$n$n$n";$b="$n $n";$c=" $n";$d="$n ";$r="abbbadddddacadaacacabbaccadacaadabaaccccababaabaca";0..4|%{gv $r[$_+($n*5)]-v}
и с $a
, you get
param($n);0..4|%{("$n$n$n","$n $n"," $n","$n ")['01110333330203002020110220302003010022220101001020'[$_+($n*5)]-48]}
Транспонирование этого и последующее объединение в одну строку дает нам lambda n:'\n'.join('xxx x x'[int(i):][:3]for i in oct(0x3028000adba93b6b0000c0ad36ebac30180c0)[:-1][n::10]).replace('x',`n`)
. Convert to decimal and, voilà, you have 2839. Reversing the process maps the digits String
в четыре двоичные строки, показанные выше.
Почти готово! Теперь осталось только добавить пробелы и цифры:
n->("A"+n+"\nB"+n+"\nC"+n+"\nD"+n+"\nE"+n).replaceAll("([ACE][235689]|A0|E0|C4|A7)(?<=(.))","$2$2$2").replaceAll("(B[0489]|D[068]|A4|C0)(?<=(.))","$2 $2").replaceAll("D2|B5|B6",n).replaceAll("[A-E]"," ")
И вуаля, неявный вывод позаботится обо всем остальном. Извините, это объяснение такое длинное, но я не вижу никакого реального способа сыграть в гольф, не сделав его менее понятным (если оно понятно...)