Votre tâche consiste à compiler des expressions régulières ... en spécifiant une substitution pour chaque caractère dans une expression régulière.
Regexes
Les expressions régulières soutiennent ces
REGEX = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL = 1 / 0
GROUP = '(' REGEX ')'
STAR = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'
Pourquoi seulement 1 ou 0? C'est pour simplifier. Le regex n'a donc que les caractères suivants:
*()|10
Il est interprété comme suit:
*
est une étoile de Kleene (répétez le groupe de gauche ou littéral 0 ou plusieurs fois).|
est l'alternance (correspond si la regex à gauche ou la regex à droite correspond).()
est le regroupement.1
correspond au caractère 1.0
correspond au caractère 0.
Comment compiler?
Vous spécifiez six extraits de code: un pour remplacer chaque caractère regex. Par exemple, si votre réponse est:
*
:FSAGFSDVADFS
|
:GSDGSAG
(
:GSDG
)
:GDSIH
1
:RGIHAIGH
0
:GIHEBN
Ensuite, vous remplacez chaque expression régulière par son extrait de code respectif, donc:
(0|11)*
est transformé en:
GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS
Quel est le programme résultant censé faire?
Votre programme:
- Prenez l'entrée.
- Sortez une valeur véridique si l'expression régulière correspond à l'entrée entière.
- Sinon, émettez une valeur fausse.
L'entrée à l'extérieur 01
est un comportement indéfini. L'entrée peut être vide.
Règles supplémentaires
- Pour un caractère regex donné, l'extrait de code résultant doit toujours être le même.
- Aucun préfixe ou suffixe n'est ajouté par la suite.
- Le regex est garanti non vide.
Notation
L'extrait le moins combiné est le gagnant. Ainsi, le score pour l'exemple de cas serait calculé comme suit:
FSAGFSDVADFS
+ GSDGSAG
+ GSDG
+ GDSIH
+ RGIHAIGH
+GIHEBN
12 + 7 + 4 + 5 + 8 + 6 = 42
Réponses:
Escargots , 48 octets
0
->)0(\0!(l.)(~
1
->)0(\1!(l.)(~
(
->)0({{(
)
->)0}}(~
|
->)0}|{(
*
->)0),(~
Si nous devions rechercher des correspondances partielles plutôt que de rechercher uniquement l'entrée complète, ce serait très facile.
0
deviendrait\0
,1
deviendrait\1
,*
deviendrait,
, et les autres se cartographieraient. Au lieu de cela, il y a beaucoup de manigances pour empêcher les matchs de commencer ailleurs que le début ou de se terminer ailleurs que la fin.!(l.)
est une assertion qui échouera si le début de la correspondance n'est pas au début de l'entrée.~
correspond à une cellule en dehors de l'entrée, elle est donc ajoutée à tous les caractères autorisés à la fin de l'expression régulière. S'il y a un autre caractère regex suivant, il est annulé par un quantificateur numérique0
ce qui nécessite qu'il soit mis en correspondance 0 fois, essentiellement en le commentant. Pour permettre à*
(,
) de fonctionner correctement malgré le fait que le test fictif hors limites soit gênant, les règles de correspondance des parenthèses du langage sont largement utilisées. De la documentation:Clair comme de la boue, non?
la source
CJam, 151 octets
Les lignes correspondent aux caractères
01(|)*
(dans cet ordre). Essayez-le en ligne!Cela n'utilise aucune expression régulière intégrée ou d'autres types de correspondance de modèle. En fait, CJam n'a aucune de ces fonctionnalités. Au lieu de cela, il commence à partir de l'expression régulière qu'il représente et construit toutes les chaînes possibles qu'il pourrait correspondre, pour enfin vérifier si l'entrée utilisateur est l'une d'entre elles.
Essais
Ce qui suit utilise un programme qui lit une expression régulière à partir de STDIN, remplace chacun de ses caractères par l'extrait de code approprié et évalue enfin le code généré pour voir s'il correspond à l'entrée spécifiée dans l'argument de ligne de commande.
Malheureusement, ce n'est pas particulièrement rapide. Il s'étouffera assez rapidement s'il y a plus de 9 caractères dans l'entrée ou plus d'une seule étoile Kleene dans l'expression régulière.
Au coût de 5 octets supplémentaires - pour un total de 156 octets - nous pouvons générer des chaînes plus courtes pour faire correspondre l'entrée potentielle et les dédupliquer. Cela ne change pas le fonctionnement du code; cela le rend simplement plus efficace.
la source
`-escaping of the
"" dans le schéma de*
. Indépendamment de cela, je n'ai pas pu faire accepter ce programme à n'importe quelle entrée, même pour le cas le plus simple où l'expression régulière ne consiste qu'en un0
(voir test dans l' interpréteur en ligne ). Je me trompe?