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.