Le problème
J'ai un tas d'expressions régulières que je dois utiliser dans du code, mais j'utilise un langage de programmation qui ne prend pas en charge l'expression régulière! Heureusement, je sais que la chaîne de test aura une longueur maximale et sera composée uniquement d'ASCII imprimable.
Le défi
Vous devez saisir une expression régulière et un nombre n
, et sortir chaque chaîne composée d'ASCII imprimables (codes ASCII 32 à 126 inclus, à
~
, sans tabulations ni sauts de ligne) d'une longueur inférieure ou égale à n
celle correspondant à cette expression régulière. Vous ne pouvez pas utiliser du tout d'expressions régulières intégrées ou de fonctions de correspondance d'expressions rationnelles dans votre code. Les expressions régulières seront limitées aux suivantes:
- Caractères littéraux (et les échappements, qui forcent un caractère à être littéral,
\.
est donc un littéral.
,\n
est un littéraln
(équivalent à justen
) et\w
est équivalent àw
. Vous n'avez pas besoin de prendre en charge les séquences d'échappement.) .
- caractère générique (n'importe quel caractère)- Classes de caractères,
[abc]
signifie "a ou b ou c" et[d-f]
signifie n'importe quoi de d à f (donc, d ou e ou f). Les seuls caractères qui ont une signification particulière dans une classe de caractères sont[
et]
(qui seront toujours échappés, alors ne vous inquiétez pas),\
(le caractère d'échappement, bien sûr),^
au début de la classe de caractères (qui est une négation ), et-
(qui est une plage). |
- l'opérateur OR, alternance.foo|bar
signifie soitfoo
oubar
, et(ab|cd)e
correspond soitabe
oucde
.*
- faire correspondre le jeton précédent répété zéro ou plusieurs fois, gourmand (il essaie de répéter autant de fois que possible)+
- répété une ou plusieurs fois, gourmand?
- zéro ou une fois- Regroupement avec des parenthèses, aux jetons de groupe pour
|
,*
.+
, ou?
La regex d'entrée sera toujours valide (c'est-à-dire que vous n'avez pas à gérer une entrée comme ?abc
ou (foo
ou toute entrée non valide). Vous pouvez sortir les chaînes dans l'ordre que vous souhaitez, mais chaque chaîne ne doit apparaître qu'une seule fois (ne pas sortir de doublons).
Les cas de test
Entrée: .*
, 1
sortie: (chaîne vide), ,
!
, "
, ..., }
,~
Entrée: w\w+
, 3
sortie: ww
,www
Entrée: [abx-z][^ -}][\\]
, 3
sortie: a~\
, b~\
, x~\
, y~\
,z~\
Entrée: ab*a|c[de]*
, 3
sortie: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Entrée: (foo)+(bar)?!?
, 6
sortie: foo
, foo!
, foofoo
,foobar
Entrée: (a+|b*c)d
, 4
sortie: ad
, cd
, aad
, bcd
, aaad
,bbcd
Entrée: p+cg
, 4
sortie: pcg
,ppcg
Entrée: a{3}
, 4
sortie:a{3}
Le gagnant
C'est du code-golf , donc le code le plus court en octets gagnera!
|
n'a que très peu de sens. Il ne semble pas gérer les groupes imbriqués ou a|b|c
. Quel est le problème avec l'utilisation des explications standard en termes de force de concaténation et d'alternance? (Et vous n'avez aucune excuse pour ne pas utiliser le bac à sable)