Власне, 58 байт
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Спробуйте в Інтернеті!
Пояснення
Тут є три основні частини, тому я збираюся її відповідно розбити.
Частина 1: Конструювання рядка base-256
Ми фактично збираємось бінарний рядок, перетворений на зворотній стороні, щоб скористатися структурою, заснованою на фактично стеці (LIFO), і уникнути ускладнень з провідними нулями в двійковому рядку. Таким чином, цільовим двійковим рядком є 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, що еквівалентно 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
в десятковій. У базовій-256 (використовуючи таблицю символів CP437 для перетворення) відповідна рядок є ♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Щоб побудувати початковий двійковий рядок, ми побудуємо рядок base-256 (скориставшись шаблоном у ньому) і виконаємо базові перетворення в десятковий і двійковий.
Рядок base-256 має такий формат (для наочності додано пробіли та нові рядки):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Таким чином, кожен з 7 середніх секцій може бути сформований за допомогою ешафотів «%s₧ªn%s6û
і заміни %s
деталей на ≥
або ÷
.
Конкретна послідовність ≥
s і ÷
s нам потрібна ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Оскільки нам це потрібно як перелік рядків довжиною-1, наївним способом представлення цього було б "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(натисніть рядок, внесіть його до списку). Однак ми можемо зробити трохи краще. Інтерпретуючи цей рядок як двійкове число (де ≥
представляє 1
і ÷
представляє 0
), ми отримуємо 13542
десятковий. Перетворивши це назад у бінарне (використовуючи традиційні 1
s і 0
s) та індексуючи в рядок довжиною-2, ми можемо отримати список, використовуючи один менший байт, ніж метод naive.
:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+
:13542├ push 13542, convert to binary
`≈"÷≥"E`M for each bit:
≈ convert to integer (from string)
"÷≥"E index into "÷≥"
"«%s₧ªn%s6û"7* push the scaffold for the middle section
% old-style Python string formatting to fill in the scaffold
"♠n≥6û"+ prepend the beginning piece
Частина 2: Перетворення на двійкове
Ця частина набагато простіша. Якби насправді була можливість безпосередньо перетворити базовий-256 у бінарний, ми б використали це. На жаль, це не так, тому нам доведеться використовувати десятковий формат як посередник.
У ,
наведеному нижче коді представлений код з частини 1 - для пояснювальних цілей я замінив код частини 1 на, ,
щоб прочитати вихід з частини 1 STDIN. Він не є частиною фактичного кінцевого коду.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Частина 3: Форматування
Якщо б завданням було просто вивести бінарний рядок таким, яким він є, ми б зробили це. Однак у нас ще є деяке форматування, щоб отримати бінарний рядок у прямокутник 21 х 23.
Як і в частині 2, ,
представляє собою вихід з попередньої частини, а не є частиною фактичного коду.
73*,`' +`M╪♂Σ♂Ri
, output from Part 2
`' o`M insert a space after every character
73* ╪ chunk into 21 pieces
♂Σ concatenate each piece
♂R reverse each piece
i flatten
(implicitly print)
Для тих, хто слідкує за домом, це еквівалентний код Python 3 (481 байт):
print('\n'.join([''.join(' '+c for c in bin(sum('\x00☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■\xa0'.index(c)*256**i for i,c in enumerate(("♠n≥6û"+("«%s₧ªn%s6û"*7)%tuple("÷≥"[int(b)]for b in bin(13542)[2:]))[::-1])))[2:])[i*42:-~i*42][::-1]for i in range(23)][::-1]))