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"
S,aT bK@c
mungkin akan disimpan hanya S,T K@
tanpa secara eksplisit menyebutkan karakter substitusi yang dapat disimpulkan secara sepele dari itu.