Japt , 43 byte
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Berisi beberapa unsintables. Cobalah online!
Tallies: 13 byte data terkompresi, 9 byte untuk mendekompresnya, dan 21 byte untuk membentuk output.
Penjelasan
Kode tidak dikunci:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Ada persis 4 kemungkinan baris berbeda: ( #
mewakili angka)
#
#
# #
###
Dengan demikian, setiap angka dapat disimpan sebagai satu set lima basis-4 digit. Karena setiap angka dapat disimpan dalam 10 bit, totalnya adalah 100 bit, yang sesuai dengan 13 byte. Saya akan melewatkan proses kompresi dan bukannya menjelaskan dekompresi.
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.
Setelah dekompresi, string terkompresi 13 byte terlihat seperti ini:
3131332333332111200122213333313321011121213133133133
Perhatikan bahwa ini akan gagal jika salah satu dari 4 digit yang dijalankan dimulai 0
, karena nol yang terdepan akan ditinggalkan saat s4
dijalankan. Kita dapat memperbaikinya dengan memiliki 0
represent #
, yang hanya muncul tiga kali, dan tidak ada yang jatuh pada awal menjalankan 4 digit.
s2 // Slice off the first two chars of the result.
Oke, jadi untuk mendapatkan string 50 digit kami untuk dikompres dengan baik dalam potongan 4, kami harus menambahkan dua digit tambahan. Menambahkannya ke awal string berarti kita dapat memotongnya dengan satu-byter ¤
.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Yang memalukan, Japt tidak memiliki built-in untuk memisahkan string menjadi irisan panjang X. Namun, ia memiliki built-in untuk mendapatkan setiap char Xth, jadi kami dapat menyimpan semua data dengan mengkodekan semua baris teratas terlebih dahulu, kemudian semua baris kedua, dll.
Jadi sekarang kita memiliki string 5 digit yang mengkodekan digit yang ingin kita buat, misalnya 32223
untuk 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.
Untuk menjelaskan angka ajaib, lihat kembali ke empat baris berbeda. Jika Anda mengganti #
dengan 1
dan
dengan 0
, Anda dapatkan
100
001
101
111
Transposing ini dan kemudian bergabung menjadi satu string memberi kita 101100010111
. Konversikan ke desimal dan, ya, Anda memiliki 2839. Membalik proses memetakan digit 0123
ke dalam empat baris biner yang ditunjukkan di atas.
Hampir selesai! Sekarang yang tersisa untuk dilakukan adalah menambahkan spasi dan digit:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
Dan presto, keluaran implisit menangani sisanya. Maaf penjelasan ini sangat panjang, tapi saya tidak melihat cara nyata untuk bermain golf tanpa membuatnya kurang dimengerti (jika bisa dimengerti ...)