Niedawno oddałem się nostalgii w postaci Bookworm Deluxe:
Jeśli nie widziałeś go wcześniej, to gra słowna, której celem jest łączenie sąsiadujących ze sobą kafelków w celu utworzenia słów. Aby ustalić, czy łańcuch jest prawidłowym słowem, sprawdza go w wewnętrznym słowniku, który jest przechowywany w skompresowanym formacie, który wygląda następująco:
aa
2h
3ed
ing
s
2l
3iis
s
2rdvark
8s
4wolf
7ves
Zasady rozpakowywania słownika są proste:
Przeczytaj numer na początku wiersza i skopiuj tyle znaków z początku poprzedniego słowa. (Jeśli nie ma numeru, skopiuj tyle znaków, ile poprzednio.)
Dołącz następujące litery do słowa.
Zatem nasze pierwsze słowo aa
, po 2h
którym następuje , oznacza „kopiowanie pierwszych dwóch liter aa
i dopisz h
”, tworząc aah
. Następnie 3ed
staje się aahed
, a ponieważ następny wiersz nie ma liczby, ponownie kopiujemy 3 znaki w celu utworzenia aahing
. Ten proces trwa przez resztę słownika. Wynikowe słowa z małej próbki wejściowej to:
aa
aah
aahed
aahing
aahs
aal
aaliis
aals
aardvark
aardvarks
aardwolf
aardwolves
Twoim wyzwaniem jest wykonanie tego rozpakowywania w jak najmniejszej liczbie bajtów.
Każdy wiersz wprowadzania będzie zawierać zero lub więcej cyfr, 0-9
po których następuje jedna lub więcej małych liter a-z
. Możesz wziąć dane wejściowe i dać wynik jako albo listę ciągów, albo jako pojedynczy ciąg ze słowami oddzielonymi dowolnym znakiem innym niż 0-9
/ a-z
.
Oto kolejny mały przypadek testowy z kilkoma przypadkami brzegowymi nie ujętymi w przykładzie:
abc cba 1de fg hi 0jkl mno abcdefghijk 10l
=> abc cba cde cfg chi jkl mno abcdefghijk abcdefghijl
Możesz także przetestować swój kod na pełnym słowniku: wejście , wyjście .
0
wiodących nie będzie mieć0
?locate
Program korzysta z tego rodzaju kodowania na ścieżek.Odpowiedzi:
Vim, 57 bajtów
Wypróbuj online!
źródło
<H<G
zamiast ostatniej zamiany zadziałałoby?<
rozwiązanie będzie niewystarczająco długie.:%s/ *
zamiast ostatniego podstawienia, aby zapisać dwa bajty.JavaScript (ES6),
66 6261 bajtówWypróbuj online!
Skomentował
źródło
Perl 6 ,
5048 bajtów-2 bajty dzięki nwellnhof
Wypróbuj online!
Port rozwiązania Arnaulda . Człowieku, ta
R||
sztuczka była kolejką górską od „Myślę, że to może być możliwe”, „nie, to niemożliwe”, „trochę może możliwe” i wreszcie „aha!”Wyjaśnienie:
$l [R||]=~$/
Część grubsza przekłada się$l= ~$/||+$l
jednak ... ma taką samą ilość bajtów:(
. Początkowo zapisywał bajty za pomocą anonimowej zmiennej, więcmy$l
zniknął, ale to nie działa, ponieważ zakres jest teraz podstawieniem, a niemap
kodem. No cóż. W każdym razie,R
jest odwrotnym metaoperatorem, więc odwraca argumenty||
, więc do$l
zmiennej przypisuje się nową liczbę (~$/
), jeśli istnieje, w przeciwnym razie sama.Może to być 47 bajtów, jeśli Perl 6 nie zgłosi błędu redundantnego dla kompilatora
=~
.źródło
Rubinowy ,
494543 bajtówWypróbuj online!
Wyjaśnienie
źródło
C,
6557 bajtówWypróbuj online!
Wyjaśnienie:
źródło
pieprzenie mózgu , 201 bajtów
Wypróbuj online!
Wymaga końcowego znaku nowej linii na końcu danych wejściowych. Wersja bez tego wymagania jest o 6 bajtów dłuższa:
pieprzenie mózgu , 207 bajtów
Wypróbuj online!
Obie wersje zakładają, że wszystkie liczby są ściśle mniejsze niż 255.
Wyjaśnienie
Taśma jest ułożona w następujący sposób:
Komórka „liczba” jest równa 0, jeśli nie wprowadzono żadnych cyfr, oraz n + 1, jeśli wprowadzono liczbę n. Dane wejściowe są pobierane z komórki oznaczonej „85”.
źródło
Python 3.6+,
172195156123122121104 bajtyWypróbuj online!
Wyjaśnienie
Uderzyłem i użyłem wyrażeń regularnych. To zaoszczędziło co najmniej 17 bajtów. :
Jeśli ciąg nie zaczyna się od cyfry, długość tego ciągu będzie wynosić
0
. To znaczy że:będzie,
n
jeślit
jest pusty, iint(t)
inaczej.usuwa liczbę, z której znaleziono wyrażenie regularne
s
(jeśli nie znaleziono żadnej liczby, usuwa0
znaki, pozostawiającs
nieskalowane) i zastępuje wszystkie oprócz pierwszegon
znaku poprzedniego słowa bieżącym fragmentem słowa; i:wyświetla bieżące słowo.
źródło
Haskell,
8281 bajtówPobiera i zwraca listę ciągów znaków.
Wypróbuj online!
Edycja: -1 bajt dzięki @Nitrodon.
źródło
Japt,
191817 bajtówPoczątkowo zainspirowany rozwiązaniem JS firmy Arnauld .
Spróbuj
źródło
Galaretka , 16 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 2 , 118 bajtów
Wypróbuj online!
źródło
Retina 0.8.2 , 69 bajtów
Wypróbuj online! Link zawiera trudniejsze przypadki testowe. Wyjaśnienie:
Dla wszystkich linii rozpoczynających się od liter, skopiuj liczbę z poprzedniej linii, zapętlając, aż wszystkie linie zaczną się od liczby.
Konwertuj liczbę na unary.
Użyj grup równoważących, aby zastąpić wszystkie
1
litery odpowiednią literą z poprzedniego wiersza. (Okazuje się, że jest nieco bardziej golfowy niż zastępowanie wszystkich serii1
s.)źródło
Czerwony , 143 bajty
Wypróbuj online!
źródło
Java (JDK) , 150 bajtów
Wypróbuj online!
źródło
Groovy , 74 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
Galaretka , 27 bajtów
Wypróbuj online!
źródło
Perl 5
-p
,4541 bajtówWypróbuj online!
Wyjaśnienie:
źródło
Groovy ,
10399 bajtówWypróbuj online!
źródło
05AB1E ,
201917 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Common Lisp, 181 bajtów
Wypróbuj online!
Nie golfowany:
Jak zwykle długie identyfikatory Common Lisp sprawiają, że nie jest on szczególnie odpowiedni dla PPCG.
źródło
Python 2 ,
10110099 bajtówWypróbuj online!
źródło
C # (interaktywny kompilator Visual C #) , 134 bajty
Wypróbuj online!
-9 bajtów dzięki @ASCIIOnly!
Mniej golfa ...
źródło
l=n>0?n:l
na,l=m>0?n:l
ponieważ nie wychwytywało sprawy, gdy linia zaczynała się od zera (0jkl
). Dzięki za wskazówkę!Scala ,
226129102 bajtówDzięki @ ASCII-tylko za ich pracę tutaj (i za Groovy odpowiedź).
Wypróbuj online!
źródło