Japt , 43 байта
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Содержит некоторые непечатные. Попробуйте онлайн!
Подсчет: 13 байт сжатых данных, 9 байт для его распаковки и 21 байт для формирования выходных данных.
объяснение
Ungolfed код:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Существует ровно 4 разных варианта строки: ( #
представляет цифру)
#
#
# #
###
Таким образом, каждое число может быть сохранено как набор из пяти цифр от 4 до 4. Поскольку каждое число может быть затем сохранено в 10 битах, общее количество составляет 100 битов, что соответствует 13 байтам. Я пропущу процесс сжатия и вместо этого объясню декомпрессию.
mZ{Zc s4}
mZ{ } // Replace each character Z in the compressed string with the following:
Zc // Take the char-code of Z.
s4 // Convert to a base-4 string.
После распаковки сжатая 13-байтовая строка выглядит следующим образом:
3131332333332111200122213333313321011121213133133133
Обратите внимание, что это не получится, если начнется любой из 4-значных циклов 0
, так как начальные нули будут s4
пропущены при запуске. Мы можем исправить это с помощью 0
представления #
, которое появляется только три раза, и ни один из них не выпадает в начале запуска из 4 цифр.
s2 // Slice off the first two chars of the result.
Итак, для того, чтобы наша строка из 50 цифр хорошо сжималась кусками по 4, нам нужно было добавить две дополнительные цифры. Добавление их в начало строки означает, что мы можем отрубить их одним байтом ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Смущает то, что у Japt нет встроенной функции для разбиения строки на куски длиной X. Однако у него есть встроенная функция для получения каждого X-го символа, поэтому мы можем хранить все данные, сначала кодируя все верхние строки, а затем все вторые ряды и т. д.
Итак, теперь у нас есть 5-значная строка, кодирующая цифру, которую мы хотим создать, например, 32223
для 0
.
q mX{2839s2 ë4X} qR
q // Split the resulting string into chars.
mX{ } // Replace each char X with the result of this function:
2839s2 // Convert the magic number 2839 to a binary string.
ë4X // Take every 4th char of this string, starting at index X.
qR // Join the result with newlines.
Чтобы объяснить магическое число, вернитесь к четырем отдельным строкам. Если вы замените #
на 1
и
с 0
, вы получите
100
001
101
111
Транспонирование этого и затем объединение в одну строку дает нам 101100010111
. Преобразование в десятичное число и, вуаля, у вас есть 2839. Обратный процесс отображает цифры 0123
в четыре двоичные строки, показанные выше.
Почти сделано! Теперь осталось только добавить пробелы и цифры:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
И прежде всего, неявный вывод заботится обо всем остальном. Извините, это объяснение такое длинное, но я не вижу реального способа сыграть в него, не сделав его менее понятным (если оно понятно ...)