Rozważ następującą alfabetycznie posortowaną listę słów:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Wszystkie słowa zaczynają się od b
, a pierwszych 5 zaczyna się od bal
. Jeśli spojrzymy tylko na pierwsze 2 słowa:
balderdash
ballet
zamiast tego moglibyśmy napisać:
balderdash
+let
gdzie ' '
jest używane, gdy słowo dzieli znak przedrostka z poprzednim słowem; z wyjątkiem '+'
znaku wskazującego OSTATNI znak, w którym drugie słowo ma przedrostek z poprzednim słowem.
Jest to rodzaj wizji „trie” : rodzic ma „ bal
” i ma 2 potomków: 'derdash'
i 'let'
.
Z dłuższą listą, taką jak:
balderdash
ballet
brooding
możemy dodatkowo użyć znaku potoku, '|'
aby wyjaśnić, gdzie kończy się wspólny prefiks, w następujący sposób:
balderdash
| +let
+rooding
a równoważne drzewo miałoby korzeń 'b'
posiadania dwojga dzieci: poddrzewo mające korzeń 'al'
i jego dwoje dzieci 'derdash'
oraz 'let'
; a 'rooding'
.
Jeśli zastosujemy tę strategię do naszej oryginalnej listy,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
otrzymujemy wynik, który wygląda następująco:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Jeśli dwa kolejne słowa na liście nie mają wspólnego prefiksu, znaki specjalne nie są zastępowane; np. dla listy:
broom
brood
crude
crumb
chcemy wynik:
broom
+d
crude
+mb
Wkład
Słowa na wejściu będą się składać wyłącznie z znaków alfanumerycznych (bez spacji i interpunkcji); może to mieć postać listy ciągów, pojedynczego ciągu lub innego rozsądnego podejścia, o ile podasz wybrany format. Żadne dwa kolejne słowa nie będą takie same. Lista zostanie posortowana alfabetycznie.
Wydajność
Dane wyjściowe mogą zawierać końcowe białe znaki na linię lub łącznie, ale nie mogą zawierać wiodących białych znaków. Dopuszczalna byłaby również lista ciągów lub temu podobnych.
To jest golf golfowy ; najkrótszy kod w każdym języku zachowuje prawo do chwalenia się. Obowiązują zwykłe zakazy dotyczące luk.
Przypadki testowe
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
poballoon
. Jakiej produkcji powinniśmy się spodziewać?+
mniej niż pierwszeo
, ale nie napisałem wyzwania, więc nie jestem pewien.Odpowiedzi:
Retina 0.8.2 ,
5857 bajtówWypróbuj online! Link zawiera jeden przypadek testowy. Edycja: Zapisałem 1 bajt dzięki @FryAmTheEggman wskazując, że przeoczyłem przejście z
\b
na^
możliwe przezm)
. Wyjaśnienie:Włącz per-line
^
dla całego programu.Dla każdego słowa spróbuj dopasować jak najwięcej od początku poprzedniego słowa. Zmień dopasowanie na spacje, z wyjątkiem ostatniego znaku, który staje się a
+
.Wielokrotnie zamieniaj wszystkie spacje bezpośrednio nad
+
s lub|
s na|
s.źródło
m)
specjalnie, aby móc to zrobić, więc denerwuję się, że przegapiłem instancję.JavaScript (ES6), 128 bajtów
Oczekuje i zwraca listę list znaków.
Wypróbuj online!
W jaki sposób?
Spacje i
+
'można wstawiać, przechodząc od pierwszego do ostatniego słowa w kolejności, ale|
' można wstawić a posteriori dopiero po+
zidentyfikowaniu. Można to osiągnąć, wykonując dwa różne przejścia, ale zamiast tego zapisujemy wskaźnik do każdego zmodyfikowanego wpisu,a[~y]
aby można go było później zaktualizować ponownie w tej samejmap()
pętli.Teoretycznie prostszym obejściem byłoby obejrzenie słów w odwrotnej kolejności i odwrócenie wyników również na końcu procesu. Ale jest to trochę kosztowne w JS i nie znalazłem sposobu na uzyskanie krótszej wersji za pomocą tej metody.
źródło
JavaScript (Node.js) ,
125122118117 bajtówWypróbuj online!
źródło
Python,
263260 bajtów- 3 bajty dzięki Jonathanowi Frechowi
Kod:
Wypróbuj online!
Wyjaśnienie:
To rozwiązanie buduje trie ze słów wejściowych i rekursywnie analizuje je na wymagane dane wyjściowe. Funkcja pobiera trójkę i ciąg s oraz dodaje x do t. Próbki są implementowane jako zagnieżdżone słowniki. Każdy słownik reprezentuje węzeł w trie. Na przykład słownik reprezentujący trie wygenerowany przez pierwszy przypadek testowy wygląda następująco:
Funkcja p powtarza się przez tę strukturę i generuje ciąg reprezentujący trie oczekiwaną przez wyzwanie. Funkcja f przyjmuje kilka argumentów jako argumenty, dodaje je wszystkie do trie za pomocą a, a następnie zwraca wynik wywołania p na trie.
źródło
C (gcc) ,
165155 bajtówPrzyjmuje trzy argumenty:
char** a
: tablica słów zakończonych znakiem nullchar* m
: tablica długości każdego słowaint n
: liczba słów w tablicyWypróbuj online!
źródło
++i<n&j<m[i]&a[i--]
zachowanie nie jest niezdefiniowane? Czy mogę polegać na ocenie gcc od lewej do prawej?Perl 6 ,
149 144142 bajtówWypróbuj online!
Jestem pewien, że można to jeszcze bardziej pograć w golfa, zwłaszcza że nie jestem ekspertem od wyrażeń regularnych. Wykorzystuje to ten sam proces, co odpowiedź Retina Neila .
źródło
Python 2 , 191 bajtów
Wypróbuj online!
źródło
Rubin , 118 bajtów
Wypróbuj online!
Akceptuje tablicę ciągów wyjściowych, modyfikując oryginalną tablicę wejściową w miejscu.
Wyjaśnienie
Podstawowa transformacja łańcucha nie jest zbyt skomplikowana, ale aby poprawnie wstawić pionowe rury, musimy iterować w odwrotnej kolejności, a ponieważ
reverse
metoda jest dość szczegółowa, zrobimy to w trudniejszy sposób. Tutaj używamymap
tylko do uruchomienia pętli, zostawmy pierwsze słowo w spokoju, a następnie iterujemy od końca za pomocą indeksów ujemnych:źródło