Trên thực tế, 58 byte
73*8╙:13542├`≈"÷≥"E`M"«%s₧ªn%s6û"7*%"♠n≥6û"+¿├`' +`M╪♂Σ♂Ri
Hãy thử trực tuyến!
Giải trình
Có ba phần chính ở đây, vì vậy tôi sẽ chia nó ra cho phù hợp.
Phần 1: Xây dựng chuỗi cơ sở-256
Chúng tôi thực sự sẽ xây dựng chuỗi nhị phân đảo ngược, để tận dụng cấu trúc dựa trên ngăn xếp (LIFO) trên thực tế và để tránh các biến chứng với các số 0 đứng đầu trong chuỗi nhị phân. Do đó, chuỗi nhị phân đích là 110011011101111001000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111011010011110101001100110111011110010001101101001011010101110111101101001111010100110011011101111011000110110100101101010111011110010100111101010011001101110111100100011011010010110101011101111001010011110101001100110111011110110001101101001011010101110111101101001111010100110011011101111001000110110100101101010111011110010100111101010011001101110111101100011011010010110
, tương đương với 20083405242288679348048842451418880256193335738939042905519679590571514414673488599852759703515507690399267425671627412178904636115120346432419478
số thập phân. Trong cơ sở-256 (sử dụng bảng ký tự CP437 để chuyển đổi), chuỗi tương ứng là♠n≥6û«≥₧ªn≥6û«÷₧ªn≥6û«÷₧ªn÷6û«≥₧ªn≥6û«≥₧ªn÷6û«÷₧ªn≥6û«≥₧ªn÷6û
. Để xây dựng chuỗi nhị phân ban đầu, chúng tôi xây dựng chuỗi cơ sở-256 (tận dụng lợi thế của mẫu trong chuỗi đó) và thực hiện chuyển đổi cơ sở sang thập phân và nhị phân.
Chuỗi cơ sở-256 có định dạng sau (khoảng trắng và dòng mới được thêm vào cho rõ ràng):
♠n≥6û
« (either ≥ or ÷) ₧ªn (either ≥ or ÷) 6û
(7 times)
Do đó, mỗi trong số 7 phần giữa có thể được hình thành bằng cách sử dụng giàn giáo «%s₧ªn%s6û
và thay thế các %s
bộ phận bằng ≥
hoặc÷
.
Trình tự cụ thể của ≥
s và ÷
s chúng ta cần là ≥≥÷≥÷÷≥≥≥÷÷≥≥÷
. Vì chúng ta cần đây là danh sách các chuỗi có độ dài 1, nên cách biểu diễn ngây thơ này sẽ là "≥≥÷≥÷÷≥≥≥÷÷≥≥÷"#
(đẩy chuỗi, biến nó thành một danh sách). Tuy nhiên, chúng ta có thể làm tốt hơn một chút. Bằng cách diễn giải chuỗi đó dưới dạng số nhị phân ( ≥
đại diện 1
và ÷
đại diện 0
), chúng ta có được 13542
số thập phân. Bằng cách chuyển đổi trở lại thành nhị phân (sử dụng 1
s và s truyền thống 0
) và lập chỉ mục thành chuỗi có độ dài 2, chúng ta có thể lấy danh sách bằng cách sử dụng một byte ít hơn phương thức ngây thơ.
: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
Phần 2: Chuyển đổi thành nhị phân
Phần này đơn giản hơn nhiều. Nếu Trên thực tế có khả năng chuyển đổi trực tiếp cơ sở 256 thành nhị phân, chúng tôi sẽ sử dụng điều đó. Thật không may, nó không có, vì vậy chúng tôi sẽ phải sử dụng thập phân như một định dạng trung gian.
Đoạn ,
mã sau biểu thị mã từ Phần 1 - với mục đích giải thích, tôi đã thay thế mã Phần 1 bằng ,
để đọc đầu ra từ Phần 1 từ STDIN. Nó không phải là một phần của mã cuối cùng thực tế.
8╙,¿├
, Part 1 result
8╙ ¿ convert from base-256 to decimal
├ convert to binary
Phần 3: Định dạng
Nếu thử thách chỉ đơn thuần là xuất chuỗi nhị phân như hiện tại, chúng ta sẽ hoàn thành. Tuy nhiên, chúng tôi vẫn có một số định dạng phải làm để có được chuỗi nhị phân thành hình chữ nhật 21 x 23.
Như trong Phần 2, phần ,
thể hiện đầu ra từ phần trước và không phải là một phần của mã thực tế.
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)
Đối với những người theo dõi tại nhà, đây là mã Python 3 tương đương (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]))