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ę n
oraz 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 n
tej 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.
,\n
jest dosłownyn
(równoważny tylkon
) i\w
jest 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|bar
oznacza jednofoo
lubbar
i(ab|cd)e
zapałki alboabe
albocde
.*
- 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 ?abc
lub (foo
czy 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)