Pertanyaan ini didasarkan pada apa yang saya temukan untuk menjawab pertanyaan lain .
Terkadang pertanyaan di sini meminta menggambar seni ASCII. Salah satu cara sederhana untuk menyimpan data untuk seni adalah RLE (run-length encoding) . Begitu:
qqqwwwwweeerrrrrtttyyyy
menjadi:
3q5w3e5r3t4y
Sekarang untuk menggambar seni ASCII besar Anda mungkin mendapatkan data seperti ini (mengabaikan karakter baris baru):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
Karakter yang digunakan untuk seni ASCII tidak akan menjadi huruf kecil atau huruf besar atau angka, hanya tanda, tanda dan simbol tetapi selalu dalam set karakter ASCII yang dapat dicetak.
Anda ingin menghemat ruang dalam string itu, jadi Anda mengganti angka dengan set karakter huruf besar (menjadi 'A' sama dengan 1, 'B' sama dengan 2 sampai 'Z' sama dengan 26), karena Anda tidak akan pernah mau dapatkan lebih dari 26 repetisi karakter. Jadi, Anda mendapatkan:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
Dan akhirnya Anda memperhatikan bahwa beberapa grup (huruf + simbol) berulang, jadi Anda mengganti grup yang muncul 3 kali atau lebih dalam string dengan karakter huruf kecil, dalam urutan atau penampilan dalam string, tetapi menyimpan dalam buffer substitusi dibuat (dalam format "grup + karakter pengganti" untuk setiap substitusi), dan membiarkan sisa string apa adanya. Jadi kelompok-kelompok berikut:
S, (3 times)
T (4 times)
K@ (3 times)
digantikan oleh 'a', 'b' dan 'c', masing-masing, karena tidak akan pernah ada lebih dari 26 kelompok yang berulang. Jadi akhirnya Anda mendapatkan:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Langkah terakhir hanya menghemat 1 byte karena grup yang benar-benar menyimpan karakter setelah diganti adalah yang muncul 4 kali atau lebih.]
Tantangan
Diberikan string yang berisi data RLE untuk menggambar seni ASCII (dengan batasan yang diusulkan), tulis program / fungsi / metode terpendek yang Anda bisa untuk mengompresnya seperti yang dijelaskan. Algoritme harus mencetak / mengembalikan dua string: yang pertama berisi kamus yang digunakan untuk kompresi, dan yang kedua adalah string terkompresi yang dihasilkan. Anda dapat mengembalikan string sebagai Tuple, array, Daftar atau apa pun, dalam urutan yang diberikan.
Perhatikan bahwa jika string tidak dapat dikompresi di langkah 2, algoritma harus mengembalikan string kosong sebagai nilai pengembalian pertama dan hasil langkah 1 sebagai nilai balik kedua.
Anda tidak perlu menyertakan hasil langkah 1 dalam nilai output, saya hanya memasukkannya dalam contoh untuk tujuan klarifikasi.
Ini adalah kode-golf , jadi semoga jawaban terpendek untuk setiap bahasa menang!
Kasus uji lain
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
sumber
S,aT bK@c
mungkin akan disimpan hanyaS,T K@
tanpa secara eksplisit menyebutkan karakter substitusi yang dapat disimpulkan secara sepele dari itu.Jawaban:
JavaScript (ES6),
168167 byteMengembalikan array dua string:
[dictionary, compressed_string]
.Uji kasus
Tampilkan cuplikan kode
sumber
Python 2 ,
269280268266 byteTidak ada yang mewah terjadi di sini. Peluang yang baik untuk menggunakan beberapa ekspresi reguler sederhana.
Versi pertama gagal untuk string yang berisi karakter khusus yang ditafsirkan dalam regex. Versi kedua (menggunakan re.escape) berfungsi dengan semua test case. Koreksi itu menghabiskan 11 byte.
Versi kedua tidak menetapkan karakter substitusi secara berurutan, seperti yang diperlukan dalam spesifikasi masalah, dan seperti yang ditunjukkan oleh @CarlosAlejo. Jadi kembali ke papan gambar.
Versi terkoreksi, lebih lanjut golf
Cobalah online!
sumber
O,a
.b=a=input()
dann,s,p=96,'',0
?\d+
akan menjadi regex yang lebih pendek untuk digunakan. Anda tidak akan pernah membahas lebih dari 26, jadi tidak ada alasan untuk memastikan bahwa itu khusus 1-2 digit. Juga, menggunakanre.escape
berarti bahwa string dasarreplace
berakhir sedikit lebih pendek: 253 byteLua, 215 byte
Sedikit pencocokan pola yang bagus.
Saya pikir Lua diremehkan ketika datang ke golf ... lihat semua pernyataan itu terjepit bersama!
sumber
Python 2 , 186 byte
Saya berharap akhirnya berguna untuk
re.subn
: CTerkompresi pada langkah 2
Tidak dikompresi pada langkah 2
Python 2 , 246 byte
Seluruh langkah kedua dilakukan dalam mengganti lambda dari re.sub. Hanya untuk bersenang-senang.
Cobalah online!
sumber
Perl 5
-pl
, 81 byteCobalah online!
Mencetak string yang disandikan pada baris pertama, tiga kali lipat pada baris kedua
sumber
Ruby
-p
, 133 byteCobalah online!
sumber