To pytanie opiera się na tym, co wymyśliłem, aby odpowiedzieć na inne pytanie .
Czasami pytania tutaj wymagają narysowania sztuki ASCII. Jednym prostym sposobem przechowywania danych dla sztuki jest RLE (kodowanie długości przebiegu) . Więc:
qqqwwwwweeerrrrrtttyyyy
staje się:
3q5w3e5r3t4y
Teraz, aby narysować dużą grafikę ASCII, być może otrzymujesz takie dane (ignorując nowe znaki wiersza):
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)
Znaki używane w sztuce ASCII nigdy nie będą małymi lub wielkimi literami lub cyframi, a jedynie znaki, znaki i symbole, ale zawsze w zestawie znaków ASCII do wydruku.
Chcesz zaoszczędzić trochę miejsca w tym ciągu, więc zamieniasz cyfry na zestaw wielkich liter (wartość „A” równa się 1, „B” równa się 2, aż „Z” równa się 26), ponieważ nigdy nie zamierzasz uzyskaj ponad 26 powtórzeń postaci. Otrzymujesz:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
I w końcu zauważasz, że niektóre grupy (litera + symbol) powtarzają się, więc zastępujesz grupy, które pojawiają się 3 lub więcej razy w ciągu przez zestaw małych liter, w kolejności lub pojawieniu się w ciągu, ale przechowując w buforze dokonane podstawienia (w formacie „grupa + char podstawienie” dla każdego podstawienia), a pozostała część łańcucha bez zmian. Więc następujące grupy:
S, (3 times)
T (4 times)
K@ (3 times)
zostaje zastąpione odpowiednio przez „a”, „b” i „c”, ponieważ nigdy nie będzie więcej niż 26 grup powtarzających się. W końcu otrzymujesz:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Ostatni krok pozwala zaoszczędzić tylko 1 bajt, ponieważ grupy, które faktycznie zapisują znaki po zastąpieniu, pojawiają się 4 razy lub więcej.]
Wyzwanie
Biorąc pod uwagę ciąg znaków zawierający dane RLE do narysowania grafiki ASCII (z zaproponowanymi ograniczeniami), napisz najkrótszy program / funkcję / metodę, którą możesz skompresować zgodnie z opisem. Algorytm musi wydrukować / zwrócić dwa ciągi: pierwszy zawierający słownik używany do kompresji, a drugi to wynikowy skompresowany ciąg. Możesz zwrócić ciągi jako krotkę, tablicę, listę lub cokolwiek innego, w podanej kolejności.
Należy zauważyć, że jeśli ciąg nie może zostać skompresowany w kroku 2, algorytm musi zwrócić pusty ciąg jako pierwszą wartość zwracaną, a wynik kroku 1 jako drugą wartość zwracaną.
Nie musisz dołączać wyniku kroku 1 do wartości wyjściowych, po prostu uwzględniam je w przykładach w celu wyjaśnienia.
To jest golf golfowy , więc może wygrać najkrótsza odpowiedź dla każdego języka!
Kolejny przypadek testowy
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
prawdopodobnie byłby przechowywany jako S,T K@
bez wyraźnego nazewnictwa znaków podstawienia, które można w prosty sposób wydedukować z tego.