Japt , 43 byte
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Chứa một số không thể in. Hãy thử trực tuyến!
Tallies: 13 byte dữ liệu nén, 9 byte để giải nén nó và 21 byte để tạo đầu ra.
Giải trình
Mã bị đánh cắp:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Có chính xác 4 khả năng hàng khác nhau: ( #
đại diện cho một chữ số)
#
#
# #
###
Do đó, mỗi số có thể được lưu trữ dưới dạng một bộ gồm năm chữ số cơ bản. Vì mỗi số có thể được lưu trữ trong 10 bit, nên tổng số là 100 bit, tương ứng với 13 byte. Tôi sẽ bỏ qua quá trình nén và thay vào đó giải thích giải nén.
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.
Sau khi giải nén, chuỗi nén 13 byte trông như thế này:
3131332333332111200122213333313321011121213133133133
Lưu ý rằng điều này sẽ thất bại nếu bất kỳ lần chạy 4 chữ số nào bắt đầu 0
, vì các số 0 đứng đầu sẽ bị tắt khi s4
chạy. Chúng tôi có thể khắc phục điều này bằng cách có 0
đại diện #
, chỉ xuất hiện ba lần và không ai trong số đó rơi khi bắt đầu chạy 4 chữ số.
s2 // Slice off the first two chars of the result.
Được rồi, vì vậy để có được chuỗi 50 chữ số của chúng tôi nén độc đáo trong các khối 4, chúng tôi đã phải thêm hai chữ số phụ. Thêm chúng vào đầu chuỗi có nghĩa là chúng ta có thể cắt chúng ra bằng một lần ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Xấu hổ thay, Japt thiếu một phần tử tích hợp để chia một chuỗi thành các lát có độ dài X. Tuy nhiên, nó có tích hợp sẵn để nhận mọi char thứ X, tuy nhiên, trước tiên chúng ta có thể lưu trữ tất cả dữ liệu bằng cách mã hóa tất cả các hàng trên cùng tất cả các hàng thứ hai, v.v.
Vì vậy, bây giờ chúng ta có chuỗi 5 chữ số mã hóa các chữ số chúng ta muốn tạo, ví dụ như 32223
cho 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.
Để giải thích số ma thuật, hãy tham khảo lại bốn hàng riêng biệt. Nếu bạn thay thế #
bằng 1
và
với 0
, bạn nhận được
100
001
101
111
Chuyển đổi điều này và sau đó tham gia vào một chuỗi duy nhất cho chúng ta 101100010111
. Chuyển đổi thành số thập phân và, voilà, bạn có 2839. Đảo ngược quá trình ánh xạ các chữ số 0123
thành bốn hàng nhị phân được hiển thị ở trên.
Sắp xong! Bây giờ tất cả những gì còn lại phải làm là thêm vào khoảng trắng và chữ số:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
Và uy tín, đầu ra ngầm chăm sóc phần còn lại. Tôi xin lỗi giải thích này quá dài, nhưng tôi không thấy bất kỳ cách thực sự nào để chơi golf mà không làm cho nó trở nên khó hiểu hơn (nếu có thể hiểu được ...)