Japt , 43 байти
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Містить деякі недруковані матеріали. Спробуйте в Інтернеті!
Талі: 13 байт стислих даних, 9 байт для їх розпакування та 21 байт для формування результату.
Пояснення
Невикористаний код:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Існує рівно 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
Зверніть увагу, що це не вдасться, якщо будь-який із чотирьохзначних запусків розпочався з 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
. Перетворити в десятковий і, voilà, у вас є 2839. Повернення процесу відображає цифри 0123
у чотири бінарні рядки, показані вище.
Майже зроблено! Тепер все, що вам залишається зробити, це додати пробіли та цифри:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
І presto, неявний вихід дбає про решту. Вибачте, що це пояснення настільки довго, але я не бачу реального способу пограти в нього, не роблячи його менш зрозумілим (якщо воно зрозуміле ...)