Sebenarnya, 58 byte
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Cobalah online!
Penjelasan
Ada tiga bagian utama di sini, jadi saya akan memecahnya sesuai.
Bagian 1: Membangun string base-256
Kita benar-benar akan membangun string biner terbalik, untuk mengambil keuntungan dari struktur berdasarkan-tumpukan (LIFO) Sebenarnya dan untuk menghindari komplikasi dengan memimpin nol dalam string biner. Jadi, string biner target adalah 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, yang setara dengan 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
dalam desimal. Di base-256 (menggunakan tabel karakter CP437 untuk konversi), string yang sesuai adalah♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Untuk membangun string biner asli, kami membangun string base-256 (memanfaatkan pola di dalamnya), dan melakukan konversi basis ke desimal dan biner.
String base-256 memiliki format berikut (spasi dan baris baru ditambahkan untuk kejelasan):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Dengan demikian, masing-masing dari 7 bagian tengah dapat dibentuk dengan menggunakan perancah «%s₧ªn%s6û
dan mengganti %s
bagian - bagian dengan salah satu ≥
atau÷
.
Urutan spesifik dari ≥
s dan ÷
s yang kita butuhkan adalah ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Karena kita membutuhkan ini sebagai daftar string panjang-1, cara naif untuk mewakili ini adalah "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(dorong string, buat menjadi daftar). Namun, kami bisa melakukan sedikit lebih baik. Dengan mengartikan string itu sebagai angka biner (di mana ≥
mewakili 1
dan ÷
mewakili 0
), kita mendapatkan 13542
dalam desimal. Dengan mengubah ini kembali ke biner (menggunakan 1
s dan s tradisional 0
), dan mengindeks ke dalam string panjang-2, kita bisa mendapatkan daftar menggunakan satu byte lebih sedikit daripada metode naif.
: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
Bagian 2: Konversi ke biner
Bagian ini jauh lebih mudah. Jika Sebenarnya memiliki kemampuan untuk secara langsung mengkonversi basis-256 ke biner, kami akan menggunakannya. Sayangnya, tidak, jadi kita harus menggunakan desimal sebagai format perantara.
Dalam ,
kode berikut ini merupakan kode dari Bagian 1 - untuk tujuan penjelasan, saya telah mengganti kode Bagian 1 dengan ,
untuk membaca output dari Bagian 1 dari STDIN. Ini bukan bagian dari kode final yang sebenarnya.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Bagian 3: Memformat
Jika tantangannya adalah hanya mengeluarkan string biner apa adanya, kita akan selesai. Namun, kami masih memiliki beberapa format yang harus dilakukan untuk mendapatkan string biner ke dalam persegi panjang 21 x 23.
Seperti pada Bagian 2, ,
mewakili output dari bagian sebelumnya, dan bukan bagian dari kode aktual.
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)
Bagi mereka yang melacak di rumah, ini adalah kode Python 3 yang setara (481 byte):
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]))