Napisz program, który pobiera (za pomocą standardowego wiersza poleceń lub wiersza poleceń) ciąg znaków w formie rekurencyjnej
PREFIX[SUFFIXES]
gdzie
PREFIX
może być dowolnym ciągiem małych liter (az), w tym pustym ciągiem, orazSUFFIXES
może być dowolną sekwencją ciągów zPREFIX[SUFFIXES]
połączoną rekurencyjną formą , w tym pustą sekwencją.
Wygeneruj listę ciągów liter pisanych małymi literami na podstawie danych wejściowych, rekurencyjnie oceniając listę ciągów znaków w każdym z przyrostków i dołączając je do przedrostka. Wyprowadza na standardowe ciągi na tej liście w dowolnej kolejności, po jednym w wierszu (plus opcjonalny końcowy znak nowej linii).
Przykład
Jeśli dane wejściowe to
cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]
to jest prefiks
cat
i i przyrostki sąs[up[][]]
,[]
,ch[e[r[]s[]]]
, ia[maran[]comb[]pult[[]ing[]]]
. Każdy sufiks ma swój własny prefiks i sufiksy z kolei.Wynikiem będą te 9 słów w dowolnej kolejności
catsup cats cat catcher catches catamaran catacomb catapult catapulting
ponieważ dane wejściowe kodują to drzewo
a każde z 9 słów wyjściowych można utworzyć, przechodząc przez drzewo od korzenia do liścia.
Notatki
Pamiętaj, że przedrostek może być pustym ciągiem, więc coś w rodzaju
[donut[][]cruller[]]
jest poprawnym wejściem, którego wyjściem byłoby (w dowolnej kolejności)
donut cruller
gdzie pusta linia jest pustym ciągiem, do którego pasuje drugi sufiks.
Sekwencja sufiksów może być również pusta, więc trywialny przypadek wejściowy
[]
ma jeden pusty wiersz jako wynik:
- Możesz założyć, że dane wejściowe wygenerują tylko unikalne słowa wyjściowe.
- np.
hat[s[]ter[]s[]]
byłoby niepoprawne wejście, ponieważhats
jest kodowane dwukrotnie. - Podobnie
[[][]]
jest niepoprawny, ponieważ pusty ciąg jest kodowany dwukrotnie.
- np.
- Być może nie przyjąć, że wejście jest tak krótki, jak to możliwe lub sprężone.
- np.
'e'
węzeł w powyższym głównym przykładzie można połączyć z'ch'
węzłem, ale to nie znaczy, że dane wejściowe są nieprawidłowe. - Podobnie
[[[[[]]]]]
jest poprawny, pomimo zakodowania pustego łańcucha tylko w sposób nieoptymalny.
- np.
- Zamiast programu możesz napisać funkcję, która przyjmuje ciąg wejściowy jako argument i drukuje dane wyjściowe normalnie lub zwraca je jako ciąg znaków lub listę.
Najkrótszy kod w bajtach wygrywa.
źródło
(a,(_:t))
może być(a,_:t)
zamiastJava, 206 bajtów
Definiuje funkcję, która akceptuje ciąg jako argument i zwraca listę ciągów. Dla dodatkowej premii zwraca ciągi w tej samej kolejności, co pytanie.
Przykładowe użycie:
Rozszerzony:
Jutro dodam wyjaśnienie.
źródło
Python, 212 znaków
Miałem nadzieję, że będę miał mniej niż 200 lat, ale nadal jestem z tego całkiem zadowolony.
źródło
JavaScript ES6, 142 bajty
źródło
P: 70 bajtów
definiuje funkcję f, która akceptuje ciąg i zwraca listę ciągów (słów)
Jako lambda (funkcja anonimowa) upuszczamy pierwsze 2 znaki f :, więc długość wynosi 68 bajtów
Test
(„catsup”; „cats”; „cat”; „catcher”; „catches”; „catamaran”; „catacomb”; „catapult”; „catapulting”)
(„pączek”; „”; „cruller”)
, „”
Notatki
, „” oznacza listę ciągów zawierających tylko ciąg pusty
Symbole są atomowe. Wciśnij / pop symbol na stosie to prosta operacja, na którą nie ma wpływu długość symbolu (patrz wyjaśnienie)
Wyjaśnienie
Q jest kuzynem APL (kx.com)
Pseudo kod:
źródło
Kobra - 181
źródło