Mengompresi Array String
PEMBARUAN: Alat-alat yang ditampilkan dalam tip ini sejak itu telah ditulis ulang, ditingkatkan dan diintegrasikan ke dalam penerjemah Japt saya . Untuk hasil terbaik, disarankan agar Anda menggunakan kompresor tersebut di atas yang terhubung di bawah ini. Saya akan meninjau kembali tip ini ketika saya punya waktu lebih banyak dan menulis ulang dengan kompresor baru dalam pikiran.
pengantar
Jika Anda memiliki larik string dalam kode Anda, cara paling jelas untuk mengompresnya adalah dengan menjalankan setiap string secaraOc
terpisah. Untuk keperluan tip ini, kami akan bekerja dengan array ["lollipop","marshmallow","nougat","oreo"]
, yang awalnya berbobot 42 byte. Menjalankan setiap string Oc
memberi kita:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Itu sekarang 33 byte, penghematan yang layak.
Langkah 1
Tapi , kita bisa melakukan yang lebih baik. Jika kita bergabung dengan array ke string yang dipisahkan baris baru, kita bisa menghilangkan tanda kurung, koma, dan backtick asing dan dibagi pada baris baru untuk mendapatkan array kita. Menerapkannya pada contoh array kita memberi kita yang berikut:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Turun ke 26 byte sekarang.
Langkah 2
Tapi , kita masih bisa melakukan yang lebih baik lagi! Kita dapat menggunakan huruf kecil untuk membatasi string, bukan baris baru, yang mungkin dimasukkan dalam kompresi. z
tidak digunakan dalam string apa pun, jadi mari kita masukkan, dan lihat bagaimana kita melanjutkan.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, gila - tidak ada perbaikan di sana; jumlah byte kami naik satu! Mungkin ada surat lain Anda bisa menggunakan tetapi, tergantung pada string Anda, mungkin ada beberapa untuk mencoba - dalam contoh kita ada 11: b,c,d,f,j,k,q,v,x,y,z
. Mencoba masing-masing akan sangat membosankan, di situlah alat praktis ini masuk; beri makan string yang dipisahkan baris baru Anda dan itu akan mencoba untuk membatasi string dengan setiap huruf yang tidak terkandung di dalamnya dan output:
- string terkompresi terpendek,
- pembatas yang digunakannya, dan
- panjangnya.
Menjalankan string sampel kami melalui itu menunjukkan yang b
memberikan hasil terbaik:
`lo¥ipáæqrÚaowbÍÞo`qb
Dan begitulah, kita hanya tinggal 24 byte.
Langkah 3
Tapi , kita bisa melakukan yang lebih baik lagi! Jika urutan string dalam array Anda tidak masalah, mungkin ada permutasi yang berbeda yang dikombinasikan dengan pembatas yang berbeda yang dapat bekerja lebih pendek. Namun, mencoba setiap kemungkinan akan jauh lebih membosankan. Dengan 4 string kami, ada 24 permutasi yang berbeda untuk dicoba. Dengan masing-masing dari 11 surat yang mungkin menjadi 264! Di situlah alat ini berperan. Sekali lagi, beri baris baru Anda dengan string yang terpisah dan itu akan mencoba setiap kombinasi dari setiap permutasi dan setiap huruf pembatas, menghasilkan:
- urutan string dalam string terkompresi terpendek,
- string terkompresi,
- pembatas yang digunakannya, dan,
- panjangnya.
Menjalankan string sampel kami melalui itu menunjukkan bahwa "nougat","oreo","lollipop","marshmallow"
dengan b
sebagai pembatas memberikan hasil terbaik, dengan jumlah byte terakhir hanya 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Tip Bonus: Kompresi Array Integer
Anda dapat menerapkan prinsip yang sama untuk array bilangan bulat dengan terlebih dahulu mengonversikan masing-masing ke basis yang lebih tinggi. Menggunakan sampel ini, array 36 byte:
[588181,156859,595676,475330,680474]
Kita dapat menurunkannya menjadi 29 byte dengan terlebih dahulu mengubahnya menjadi array string 32 dan kemudian menjalankannya melalui program kompresi pertama:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Atau serendah 27 byte menggunakan program kedua:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Anda mungkin dapat menyimpan byte atau 2 lain di atasnya dengan memindahkan konversi integer ke metode yang sudah Anda jalankan pada array.
Catatan
- Jangan lupa untuk memperhitungkan 1 atau 2 byte tambahan
q<letter>(<space>)
biaya lebih ·
. Meskipun, Anda mungkin dapat menggunakan salah satu cara pintas Unicode untuk mendapatkan byte kembali, tergantung pada pembatas Anda ( qÊ
sama dengan ql<space>
, misalnya).
- Sebuah kata hati-hati saat menggunakan alat terakhir: semakin banyak string yang Anda miliki, semakin banyak permutasi akan ada dan semakin lambat program akan berjalan, sampai akhirnya runtuh. Sebagaimana dirinci di atas, dengan 4 string sampel dan 11 huruf yang memungkinkan untuk dicoba, ada 264 kemungkinan kombinasi, tambahkan jumlah string hanya 1 dengan 11 huruf yang sama dan kami sudah memiliki 1320 kombinasi untuk dicoba. (Anda dapat menggunakan alat ini untuk menghitung jumlah kombinasi, jika Anda mau).
Kredit
- Oliver untuk inspirasi menciptakan alat yang ditemukan di tip ini.
- ETHproduk untuk proofreading.