Problem
Mam kilka wyrażeń regularnych, których muszę użyć w jakimś kodzie, ale używam języka programowania, który nie obsługuje wyrażeń regularnych! Na szczęście wiem, że łańcuch testowy będzie miał maksymalną długość i będzie się składał wyłącznie z drukowalnego ASCII.
Wyzwanie
Musisz wprowadzić wyrażenie regularne i liczbę noraz wypisać każdy ciąg złożony z drukowalnego ASCII (kody ASCII od 32 do 126 włącznie, do ~, bez tabulatorów lub znaków nowej linii) o długości mniejszej lub równej ntej pasującej do tego wyrażenia regularnego. Nie możesz w ogóle używać wbudowanych wyrażeń regularnych ani funkcji dopasowywania wyrażeń regularnych w kodzie. Wyrażenia regularne będą ograniczone do następujących:
- Dosłowne znaki (i znaki ucieczki, które zmuszają znak do bycia dosłownym, więc
\.jest dosłowny.,\njest dosłownyn(równoważny tylkon) i\wjest równoważnyw. Nie trzeba obsługiwać sekwencji specjalnych). .- znak wieloznaczny (dowolny znak)- Klasy znaków
[abc]oznaczają „a lub b lub c” i[d-f]oznaczają wszystko od d do f (tak, d lub e lub f). Jedynymi znakami, które mają specjalne znaczenie w klasie znaków są[i](które zawsze będą ucieczką, więc nie przejmuj się nimi),\(oczywiście znak ucieczki)^na początku klasy postaci (co jest negacją ) i-(który jest zakresem). |- operator OR, przemiennie.foo|baroznacza jednofoolubbari(ab|cd)ezapałki alboabealbocde.*- dopasuj poprzedni token powtórzony zero lub więcej razy, chciwy (próbuje powtórzyć tyle razy, ile to możliwe)+- powtórzył jeden lub więcej razy, zachłanny?- zero lub jeden raz- Grupowanie w nawiasach na żetony grupowych
|,*.+lub?
Regex wejście zawsze będzie poprawny (tzn nie trzeba obsługiwać wejście jak ?abclub (fooczy każdy nieważny wejścia). Możesz wyprowadzać ciągi w dowolnej kolejności, ale każdy ciąg musi pojawić się tylko raz (nie wysyłaj żadnych duplikatów).
Przypadki testowe
Wejście: .*, 1
Wyjście: (pusty ciąg znaków), , !, ", ..., },~
Wejście: w\w+, 3
Wyjście: ww,www
Wejście: [abx-z][^ -}][\\], 3
Wyjście: a~\, b~\, x~\, y~\,z~\
Wejście: ab*a|c[de]*, 3
Wyjście: c, cd, ce, aa, cde, ced, cdd, cee,aba
Wejście: (foo)+(bar)?!?, 6
Wyjście: foo, foo!, foofoo,foobar
Wejście: (a+|b*c)d, 4
Wyjście: ad, cd, aad, bcd, aaad,bbcd
Wejście: p+cg, 4
Wyjście: pcg,ppcg
Wejście: a{3}, 4
Wyjście:a{3}
Zwycięzca
To jest golf golfowy , więc wygra najkrótszy kod w bajtach!
|ma większego sensu. Nie obsługuje grup zagnieżdżonych ani a|b|c. Co jest złego w korzystaniu ze standardowych wyjaśnień dotyczących silnego wiązania konkatenacji i naprzemienności? (I nie masz wytłumaczenia, że nie używasz piaskownicy)