Dizi Dizilerini Sıkıştırma
GÜNCELLEME: Bu ipucunda yer alan araçlar o zamandan beri yeniden yazıldı, geliştirildi ve Japt yorumlayıcıma entegre edildi . En iyi sonuçlar için, bu kompresörü aşağıda bağlı olanlardan herhangi birinde kullanmanız önerilir. Biraz daha zamanım olduğunda bu ipucuna tekrar bakacağım ve yeni kompresör göz önünde bulundurularak yeniden yazacağım.
Giriş
Kodunuzda bir dizi dizeniz varsa, onu sıkıştırmanın en belirgin yolu her dizeyiOc
ayrı ayrı çalıştırmaktır . Bu ipucunun amaçları doğrultusunda, ["lollipop","marshmallow","nougat","oreo"]
başlangıçta 42 bayt ağırlığında olan diziyle çalışacağız . Her dizeyi çalıştırmak Oc
bize şunları verir:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Şimdi 33 bayt, iyi bir tasarruf.
Aşama 1
Ama daha iyisini yapabiliriz. Diziyi satır satırından ayrılmış bir dizeye birleştirirsek, dizimizi almak için köşeli parantezlerden, virgüllerden ve yabancı backticklerden kurtulabilir ve satır satırına ayırabiliriz. Bunu örnek dizimize uygulamak bize aşağıdakileri verir:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Şimdi 26 bayta kadar.
Adım 2
Ama yine de daha iyisini yapabiliriz! Sıkıştırma işlemine dahil edilebilecek yeni satır yerine dizeleri ayırmak için küçük harf kullanabiliriz. z
dizelerimizin hiçbirinde kullanılmaz, hadi bunu bırakalım ve nasıl başlayacağımızı görelim.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, fındık - orada gelişme yok; bayt sayımız bir arttı! Kullanabileceğin başka bir mektup var olabilir ama, senin dizeleri bağlı denemek için epeyce olabilir - bizim örneğimizde 11 vardır: b,c,d,f,j,k,q,v,x,y,z
. Her birini denemek oldukça sıkıcı olurdu, bu kullanışlı araç burada devreye giriyor; satırsonu ayrılmış dizelerinizi beslediğinizde, dizelerin hiçbirinde bulunmayan her harfle sınırlandırılmaya çalışılacaktır:
- en kısa sıkıştırılmış dize,
- kullandığı sınırlayıcı ve
- uzunluğu.
Örnek dizelerimizin içinden geçilmesi, bunun b
en iyi sonuçları verdiğini gösterir :
`lo¥ipáæqrÚaowbÍÞo`qb
Ve işte burada, sadece 24 bayta düştük.
Aşama 3
Ama daha iyisini yapabiliriz ! Dizinizdeki dizelerin sırası önemli değilse, belki de daha kısa çalışabilecek farklı bir sınırlayıcı ile birlikte farklı bir permütasyon olabilir. Bununla birlikte, her olasılığı denemek çok daha sıkıcı olacaktır. 4 telimizle denemek için 24 farklı permütasyon vardır. 264 haline gelen 11 olası harfin her biri ile! Bu araç devreye giriyor. Yine, yeni satır ayrılmış dizelerinizi besleyin ve her permütasyonun ve her sınırlayıcı mektubun her kombinasyonunu deneyecek, çıktı:
- en kısa sıkıştırılmış dizedeki dizelerin sırası,
- sıkıştırılmış dize,
- kullandığı sınırlayıcı ve
- uzunluğu.
İçinden bizim örnek dizeleri Koşu gösterir "nougat","oreo","lollipop","marshmallow"
ile b
bir ayırıcı sadece 23 nihai bayt sayısı ile, daha iyi sonuçlar vermektedir:
`ÍÞo½o¥ipáæqrÚaow`qb
Bonus İpucu: Tamsayı Dizi Sıkıştırma
Aynı prensibi, önce her birini daha yüksek bir tabana dönüştürerek tamsayı dizilerine uygulayabilirsiniz. Bu örnek kullanılarak, 36 baytlık dizi:
[588181,156859,595676,475330,680474]
İlk olarak 32 temel dizeden oluşan bir diziye dönüştürüp ardından ilk sıkıştırma programında çalıştırarak 29 bayta düşürebiliriz:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Veya ikinci programı kullanarak 27 bayt kadar düşük:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Tamsayı dönüşümünü dizide zaten çalıştırdığınız bir yönteme taşıyarak bunun üzerine başka bir bayt veya 2 kaydedebilirsiniz.
notlar
- 1 veya 2 ekstra bayt
q<letter>(<space>)
maliyetini hesaba katmayı unutmayın ·
. Bununla birlikte, sınırlayıcınıza bağlı olarak bir bayt geri almak için Unicode kısayollarından birini kullanabilirsiniz ( örneğin qÊ
, aynıdır ql<space>
).
- Son aracı kullanırken dikkat edilmesi gereken bir nokta: Ne kadar çok dizeniz varsa, o kadar fazla permütasyon olur ve program yavaşça çalışana kadar yavaşlar. Yukarıda ayrıntılı olarak açıklandığı gibi, 4 örnek dizimiz ve 11 olası harfimizle, 264 olası kombinasyon var, aynı 11 harfle dize sayısını sadece 1 artırın ve zaten denemek için 1320 kombinasyonumuz var. (İsterseniz kombinasyon sayısını saymak için bu aracı kullanabilirsiniz ).
Kredi
- Oliver, bu ipucunda bulunan araçları yaratmak için ilham kaynağı oldu.
- Düzeltme için ETHproductions.