El problema
¡Tengo un montón de expresiones regulares que necesito usar en algún código, pero estoy usando un lenguaje de programación que no admite expresiones regulares! Afortunadamente, sé que la cadena de prueba tendrá una longitud máxima y estará compuesta solo de ASCII imprimible.
El reto
Debe ingresar una expresión regular y un número n
, y generar cada cadena compuesta de ASCII imprimible (códigos ASCII 32 a 126 inclusive, a
~
, sin pestañas o nuevas líneas) de longitud menor o igual que n
esa coincidencia con esa expresión regular. Es posible que no utilizar construido en expresiones regulares o funciones coincidentes de expresiones regulares en su código. Las expresiones regulares se limitarán a lo siguiente:
- Caracteres literales (y escapes, que obligan a un carácter a ser literal, por lo que
\.
es un literal.
,\n
es un literaln
(equivalente a justn
) y\w
es equivalente aw
. No es necesario admitir secuencias de escape). .
- comodín (cualquier personaje)- Clases de caracteres,
[abc]
significa "a o b o c" y[d-f]
significa cualquier cosa de d a f (entonces, d o e o f). Los únicos caracteres que tienen un significado especial en una clase de caracteres son[
y]
(que siempre se\
escaparán , así que no se preocupe por eso), (el carácter de escape, por supuesto),^
al comienzo de la clase de caracteres (lo cual es una negación ) y-
(que es un rango). |
- el operador OR, alternancia.foo|bar
significafoo
obar
, y(ab|cd)e
coincide conabe
ocde
.*
- coincide con el token anterior repetido cero o más veces, codicioso (intenta repetir tantas veces como sea posible)+
- repetido una o más veces, codicioso?
- cero o una vez- Agrupación con paréntesis, a fichas de grupo para
|
,*
.+
o?
La expresión regular de entrada siempre será válida (es decir, no tiene que manejar entradas como ?abc
o(foo
o cualquier entrada no válida). Puede generar las cadenas en el orden que desee, pero cada cadena debe aparecer solo una vez (no generar duplicados).
Los casos de prueba
Entrada: .*
, 1
Salida: (cadena vacía), ,
!
, "
, ...,}
,~
Entrada: w\w+
, 3
Salida:ww
,www
Entrada: [abx-z][^ -}][\\]
, 3
Salida: a~\
, b~\
, x~\
,y~\
,z~\
Entrada: ab*a|c[de]*
, 3
Salida: c
, cd
, ce
, aa
, cde
, ced
, cdd
,cee
,aba
Entrada: (foo)+(bar)?!?
, 6
Salida: foo
, foo!
, foofoo
,foobar
Entrada: (a+|b*c)d
, 4
Salida: ad
, cd
, aad
, bcd
, aaad
,bbcd
Entrada: p+cg
, 4
Salida: pcg
,ppcg
Entrada: a{3}
, 4
Salida:a{3}
El ganador
Este es el código de golf , por lo que el código más corto en bytes ganará.
|
tiene muy poco sentido. No parece manejar grupos anidados o a|b|c
. ¿Qué tiene de malo usar las explicaciones estándar en términos de cuán fuertemente se unen la concatenación y la alternancia? (Y no tienes excusa para no usar el sandbox)