Bu soru, başka bir soruyu cevaplamak için bulduğum sorulara dayanıyor .
Bazen buradaki sorular bazı ASCII sanatlarını çizmeyi ister. Tekniğin verilerini depolamanın basit bir yolu RLE'dir (çalışma uzunluğu kodlaması) . Yani:
qqqwwwwweeerrrrrtttyyyy
dönüşür:
3q5w3e5r3t4y
Şimdi büyük bir ASCII sanatı çizmek için şu şekilde veri alıyor olabilirsiniz (yeni satır karakterlerini göz ardı ederek):
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)
ASCII sanatı için kullanılan karakterler asla küçük veya büyük harf veya rakam olmayacak, sadece işaretler, işaretler ve semboller olacak, ancak her zaman yazdırılabilir ASCII karakter kümesinde bulunmayacaktır.
Bu dizede biraz yer kazanmak istersiniz, böylece sayıları büyük harf karakter kümesiyle değiştirirsiniz ('A' olmak 1'e eşittir, 'B' 'Z' 26'ya eşit olana kadar 2'ye eşittir), çünkü asla bir karakterin 26'dan fazla tekrarını almak. Yani şunu elde edersiniz:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
Ve son olarak bazı (harf + sembol) gruplarının tekrarlandığını fark edersiniz, bu nedenle dizede 3 kez veya daha fazla görünen grupları, dizedeki sırayla veya görünümde küçük harf karakter kümesiyle değiştirirsiniz, ancak sübstitüsyonlar (her bir sübstitüsyon için "grup + sübstitüe char" formatında) ve ipin geri kalanını olduğu gibi bırakır. Yani aşağıdaki gruplar:
S, (3 times)
T (4 times)
K@ (3 times)
sırasıyla 'a', 'b' ve 'c' ile ikame edilir, çünkü asla 26'dan fazla grup tekrarlanmaz. Sonunda şunu elde edersiniz:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Son adım yalnızca 1 bayt kazandırır çünkü değiştirildikten sonra karakterleri gerçekten kaydeden gruplar 4 kez veya daha fazla görünen gruplardır.]
Meydan okuma
Bir ASCII resmi çizmek için RLE verilerini içeren bir dize verildiğinde (önerilen kısıtlamalarla), açıklandığı gibi sıkıştırmak için yapabileceğiniz en kısa programı / işlevi / yöntemi yazın. Algoritma iki dizeyi yazdırmalı / döndürmelidir: ilki sıkıştırma için kullanılan sözlüğü içerir ve ikincisi sonuçta oluşan sıkıştırılmış dizedir. Dizeleri verilen sırayla bir Tuple, bir dizi, Liste veya herhangi bir şekilde döndürebilirsiniz.
Dizenin 2. adımda sıkıştırılamaması durumunda, algoritmanın boş bir dizeyi ilk dönüş değeri olarak ve 1. adımın sonucunu ikinci dönüş değeri olarak döndürmesi gerektiğini unutmayın.
1. adımın sonucunu çıktı değerlerine dahil etmenize gerek yoktur, sadece açıklama amacıyla bunları örneklere dahil ediyorum.
Bu kod golf , bu yüzden her dil için en kısa cevap kazanabilir!
Başka bir test örneği
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
muhtemelen S,T K@
önemsiz bir şekilde bundan çıkarılabilen ikame karakterlerini açıkça adlandırmadan saklanırdı .