Golf Dizeleri


22

Dize sıkıştırma gerektiren zorluklarına her zaman cevap , bunun ana nedeni sıkıştırma araçlarını gerektiği kadar etkili kullanmayı bilmememdi .

Bu sebeple bu soruyu gönderdim. Diğer ipuçlarımdaki soruların aksine, bu, dile özgü bir anlam ifade etmez, eğer kendi dilinizde herhangi bir ipucu düşünebiliyorsanız, o dili gönderebilirsiniz (dili belirtmeniz şartıyla). Genel ipuçları da takdir edilmektedir.

Peki, dize sıkıştırma araçlarını maksimum etkinliklerinde nasıl kullanabilirim?

Yanıtlar:


9

Temel dönüşüm (CJam)

Boş bir bayt ile başlamayan ASCII dizelerini kodlamanın kolay bir yolu, taban 128'den tam sayıya, ardından taban 256'ya dönüştürmektir:

128b256b:c              e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.

Bu, her ASCII karakterini kodlamak için 7 bit kullanır.

Orijinal dize sadece örneğin küçük harfler, oluşur ve bir ile hiçbir başlangıç yaparsa a , biz haritalama başlayabilirsiniz "a...z"için [0 ... 25]yukarıdaki gibi devam edin:

'afm26b256b:c               e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.

Son olarak, orijinal dize yalnızca birkaç benzersiz karaktere sahipse (ASCII sanatında ortaktır), alfabeyi açıkça belirtmek daha iyidir.

Örneğin:

" +-/\|"f#6b256b:c                       e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.

Temel kural olarak, orijinal dizginin ilk karakterinin alfabenin ikinci karakteri olmasını, orijinal dizginin bir sonraki belirgin karakterinin alfabenin ilk karakteri, orijinal dizginin bir sonraki karakteri olmasını istersiniz . alfabenin üçüncü karakteri, orijinal dizgenin bir sonraki belirgin karakteri, alfabenin dördüncü karakteri vb.

Son örneğin kodlayıcısı aşağıdaki gibi çalışır:

" +-/\|"f# e# Replace each character by its index in that string.
6b256b     e# Convert from base 6 (length of the alphabet) to base 256.
:c         e# Cast each digit to character.

Son örneğin kod çözücüsü aşağıdaki şekilde çalışır:

256b6b     e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.

2
Daha belirgin olurdum: bir kural olarak, orijinal dizginin ilk karakterinin alfabenin ikinci karakteri olmasını, orijinal dizginin bir sonraki belirgin karakterinin alfabenin ilk karakteri olmasını istersiniz,
Peter Taylor,

@PeterTaylor Eklendi. Teşekkürler!
Dennis,

9

Büyük Kolmogorov karmaşıklığı bazı yapılara ilişkin sorular sormaktadır ancak basit bir formül yoktur (örneğin şarkı sözleri) tipik olarak gramer tabanlı bir yaklaşımdan faydalanacaktır. Temelde, tekrarlanan alt dizgileri ayıklar ve onları bir şekilde kodlarsınız. Lempel-Ziv'in yaptığı, oldukça kısıtlanmış bir gramer sınıfını kullanarak; daha genel gramerler kullanıyorsanız, kuralları nasıl kodlayacağınızı bulmanız gerekir. Örneğin bir yaklaşım burada kurallar (sayısına göre her bir kaynak byte offset "offset kodlama" dir n), atama bayt 1için nkurallara, kullanma 0defalarca ayrı kurallara bayt ve byte yerine ideğerlendirdi kuralla i. Sonunda n, her bir bayttan çıkartarak ofseti geri alırsınız .

Aslında çeşitli yaklaşımları uygulayan bir Java programı yazdım :

Yaklaşımların çoğu iki aşamalı bir süreç izler. İlk aşamada, dize onu üreten bir gramer haline dönüştürülür; ikinci aşamada, dilbilgisi bir GolfScript programına dönüştürülür. İlk aşama uygulamaları büyük ölçüde Charikar, Lehman, Liu, Panigrahy, Prabhakaran, Sahai ve Shelat (2005) 'e dayanmaktadır. En küçük gramer problemi , Enformasyon Teorisi, IEEE İşlemleri, 51 (7), 2554-2576.

Ayrıca, bir Lempel-Ziv yaklaşımı, bir temel kodlama yaklaşımı ve bir ikinci uzunluk kodlama yaklaşımı içerir ve en kısa programı veren yaklaşımı tanımlar.


0

Stax

İçinde Stax kod golf dili denilen bir yararlı küçük aracı var düz dize kompresör . Tam olarak nasıl çalıştığını bilmiyorum, ama nereye başka yoktur do nasıl çalıştığını biliyorum. Dizeleri sayılara, ardından Base 256'ya dönüştürür. 0x4 ve 0xFF kopyalamak için dönüştürülmüş olan CP437'dir . Paketlenmiş vergi. Bazı iyi sıkıştırma için dizelerinizi literal kompresör dizgesiyle ve ardından Paketle ile dönüştürebilirsiniz.

Bu işlemi kullanarak "Bu dize otuz iki bayttır" dizgesi v * "A] - | W4]} 3"% değerine dönüştürülebilir (sıkıştırılmış dize, genellikle Stax'taki normal bir dize arasındaki farkı belirtmek için ters tırnaklarla çevrelenmiştir. ) ve nihayet üvìë! [JqJu ← ▓α 18 byte sıkıştırma / azaltma için, yarıdan fazla.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.