O problema
Eu tenho várias expressões regulares que preciso usar em algum código, mas estou usando uma linguagem de programação que não suporta regex! Felizmente, eu sei que a sequência de teste terá um comprimento máximo e será composta apenas por ASCII imprimível.
O desafio
É necessário introduzir uma expressão regular e um número n
, e saída de cada cadeia de caracteres composta por ASCII imprimível (códigos ASCII de 32 a 126, inclusive, para
~
, sem separadores ou novas linhas) de comprimento inferior ou igual a n
que corresponda a esse expressão regular. Você não pode usar expressões regulares incorporadas ou funções de correspondência de expressões regulares em seu código. Expressões regulares serão limitadas ao seguinte:
- Caracteres literais (e escapes, que forçam um caractere a ser literal, assim
\.
é um literal.
,\n
é um literaln
(equivalente a apenasn
) e\w
são equivalentes aw
. Você não precisa oferecer suporte a seqüências de escape.) .
- curinga (qualquer caractere)- Classes de caracteres,
[abc]
significa "a ou b ou c" e[d-f]
significam algo de d a f (então, d ou e ou f). Os únicos personagens que têm significado especial em uma classe de personagem são[
e]
(que sempre serão escapados, portanto, não se preocupe com eles),\
(o caractere de escape, é claro),^
no início da classe de personagem (que é uma negação ) e-
(que é um intervalo). |
- o operador OR, alternação.foo|bar
significa umfoo
oubar
, e(ab|cd)e
corresponde a umabe
oucde
.*
- corresponda ao token anterior repetido zero ou mais vezes, ganancioso (tenta repetir o máximo de vezes possível)+
- repetido uma ou mais vezes, ganancioso?
- zero ou uma vez- Agrupamento com parênteses, para os tokens de grupo para
|
,*
.+
ou?
A regex entrada será sempre válido (ou seja, você não tem que lidar com entrada, como ?abc
ou (foo
ou qualquer entrada inválida). Você pode produzir as strings na ordem que desejar, mas cada string deve aparecer apenas uma vez (não produza duplicatas).
Os casos de teste
Entrada: .*
, 1
saída: (string vazia), ,
!
, "
, ..., }
,~
Entrada: w\w+
, 3
saída: ww
,www
Entrada: [abx-z][^ -}][\\]
, 3
saída: a~\
, b~\
, x~\
, y~\
,z~\
Entrada: ab*a|c[de]*
, 3
saída: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Entrada: (foo)+(bar)?!?
, 6
saída: foo
, foo!
, foofoo
,foobar
Entrada: (a+|b*c)d
, 4
saída: ad
, cd
, aad
, bcd
, aaad
,bbcd
Entrada: p+cg
, 4
saída: pcg
,ppcg
Entrada: a{3}
, 4
saída:a{3}
O vencedor
Isso é código-golfe , então o código mais curto em bytes vencerá!
|
faz muito pouco sentido. Parece não manipular grupos aninhados ou a|b|c
. O que há de errado em usar as explicações padrão em termos de quão fortemente concatenação e alternância se ligam? (E você não tem desculpa para não usar a caixa de areia)