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"
źródło
S,aT bK@c
prawdopodobnie byłby przechowywany jakoS,T K@
bez wyraźnego nazewnictwa znaków podstawienia, które można w prosty sposób wydedukować z tego.Odpowiedzi:
JavaScript (ES6),
168167 bajtówZwraca tablicę z dwóch ciągów:
[dictionary, compressed_string]
.Przypadki testowe
Pokaż fragment kodu
źródło
Python 2 ,
269280268266 bajtówNie dzieje się tu nic szczególnego. Dobra okazja do użycia prostych wyrażeń regularnych.
Pierwsza wersja nie powiodła się w przypadku ciągów znaków specjalnych, które zostały zinterpretowane w wyrażeniu regularnym. Druga wersja (wykorzystująca re.escape) działa ze wszystkimi przypadkami testowymi. Ta korekta kosztuje 11 bajtów.
Druga wersja nie przypisywała znaków podstawienia w kolejności, zgodnie z wymaganiami specyfikacji problemu i jak wskazał @CarlosAlejo. Wróćmy do tablicy kreślarskiej.
Wersja poprawiona, dalej golfowa
Wypróbuj online!
źródło
O,a
.b=a=input()
in,s,p=96,'',0
?\d+
byłoby krótszym wyrażeniem regularnym w użyciu. I tak nigdy nie przekroczysz 26, więc nie ma powodu, aby mieć dokładnie 1-2 cyfry. Ponadto użyciere.escape
oznacza, że podstawowy ciąg znakówreplace
kończy się nieco krócej: 253 bajtówLua, 215 bajtów
Po prostu trochę dopasowania wzoru.
Myślę, że Lua jest niedoceniana, jeśli chodzi o grę w golfa ... spójrz na te wszystkie wypowiedzi ułożone razem!
źródło
Python 2 , 186 bajtów
Miałem nadzieję, że w końcu znajdę zastosowanie dla
re.subn
: CKompresowany w kroku 2
Bez kompresji w kroku 2
Python 2 , 246 bajtów
Cały drugi krok wykonano w repl lambda z re. Dla żartu.
Wypróbuj online!
źródło
Perl 5
-pl
, 81 bajtówWypróbuj online!
Drukuje zakodowany ciąg w pierwszym wierszu, a trzykrotnie w drugim wierszu
źródło
Rubin
-p
, 133 bajtyWypróbuj online!
źródło