Échauffement: regex, papier, ciseaux
C’est le défi que j’ai voulu publier à l’origine, avant de réaliser qu’il existe une solution très courte. Néanmoins, il peut être intéressant de réfléchir à la préparation du défi ci-dessous.
Ecrivez trois regex R , P et S de telle sorte qu’ils se correspondent dans un style cyclique Rock, Paper, Scissors. En particulier, R correspond S , S correspond à P et P correspond à R , mais R ne correspond P , S ne correspond R et P ne correspond pas à S . Voici un tableau pratique:
Regex Matches Doesn't match
R S P
P R S
S P R
Peu importe ce que font R , P et S sur d’autres entrées, y compris elles-mêmes.
Ici, correspondance signifie simplement que certaines sous-chaînes (éventuellement vides) de l'entrée sont mises en correspondance. La correspondance n'a pas besoin de couvrir la totalité de l'entrée.
Le défi: regex, papier, ciseaux, lézard, spock
Pour ce défi, vous résolvez une version plus sévère du problème ci-dessus, basée sur la variante RPS Rock, Paper, Scissors, Lézard, Spock (popularisée par The Big Bang Theory ). Dans RPSLV, il y a cinq symboles différents qui se battent en deux cycles:
- Rock → Ciseaux → Lézard → Papier → Spock → Rock
- Rock → Lézard → Spock → Ciseaux → Papier → Rock
Vous devriez écrire cinq expressions rationnelles R , P , S , L et V qui imitent cette structure lorsqu'elles sont données en entrée. Voici le tableau correspondant:
Regex Matches Doesn't match
R L, S V, P
L V, P S, R
V S, R P, L
S P, L R, V
P R, V L, S
Pour être clair, vous devriez ne pas correspondre à la chaîne R
, P
etc, mais les autres expressions rationnelles. Par exemple, si votre expression rationnelle R est ^\w$
par exemple, alors P et V doivent correspondre à la chaîne ^\w$
, alors que S et L ne le devraient pas.
De nouveau, la correspondance signifie simplement qu'au moins une sous-chaîne (éventuellement vide) de l'entrée est mise en correspondance. La correspondance n'a pas besoin de couvrir la totalité de l'entrée. Par exemple \b
(limite de mot) correspond hello
(au début et à la fin), mais ne correspond pas (^,^)
.
Vous pouvez utiliser n’importe quelle saveur regex, mais veuillez indiquer votre choix dans votre réponse et, si possible, fournissez un lien vers un testeur en ligne pour la saveur choisie. Vous ne pouvez utiliser aucune fonctionnalité regex permettant d'appeler du code dans le langage hôte de la version (comme le e
modificateur de la version de Perl ).
Les délimiteurs (comme /regex/
) ne sont pas inclus dans la regex lorsqu'ils sont donnés en entrée à un autre, et vous ne pouvez pas utiliser de modificateurs en dehors de la regex. Certaines variantes vous permettent encore d'utiliser des modificateurs avec une syntaxe en ligne telle que (?s)
.
Votre score est la somme des longueurs des cinq regex en octets. Plus c'est bas, mieux c'est.
Il s'avère beaucoup plus simple de trouver une solution efficace à ce problème que cela ne semble à première vue, mais j'espère que trouver une solution optimale est assez délicat.
la source
\b
(limite de mot), les correspondanceshello
(au début et à la fin), mais ça ne correspond pas(^,^)
. "Réponses:
PCRE.NET,3532 octets-3 octets grâce à Martin Ender
Roche:
Papier:
Les ciseaux:
Lézard:
Spock:
L'idée ici est de faire correspondre les caractères à la fin des autres expressions rationnelles qui sont des caractères réservés aux expressions rationnelles, mais cessent d'être traitées comme telles à l'intérieur d'une classe de caractères.
la source
PCRE,
1514 octetsRoche:
B
Papier:
\b$
Les ciseaux:
b|B.
Lézard:
\B.
Spock:
^\w
la source
Q
(une solution 14b existe avec Lizard = `\ Q \`, le reste est semblable au vôtre), mais en vain.pas de fonctions de fantaisie,
3530 octets5 octets sauvés par l'idée de Neil qui utilise ce qui a
]
besoin de pas\
.Cela fonctionne par exemple avec le
re
module python .Il recherche un
]
précédé d'une lettre qui indique de quelle règle il s'agit.Version précédente utilisée
R='\[[RSL]'
etc.Une tentative antérieure avec le score 40 utilisait
R='[SL]x|Rx'
etc.la source
R='[LSR]]'
etc.This works with python's re
Eh bien, Python devrait probablement être l'en-têtePCRE,
2019Roche
Papier
Les ciseaux
Spock
Lézard
la source
20 octets
la source
JavaScript, 45 octets
Une autre solution triviale.
la source
POSIX,
5045 octetsPourrait être plus court mais le tour (masquer les correspondances après $) s’est utilisé, alors je cherche un autre moyen
Les 5 premiers caractères de chaque chaîne sont ignorés lors de la correspondance. Ainsi, la chaîne cible effective se simplifie pour ne comprendre que X? Y ?. Aucun d'entre eux n'a de lettres doubles parce que "?" est un caractère ordinaire, donc les 4 derniers caractères utilisés comme regex doivent correspondre (chaîne nulle). Ainsi, les modèles se réduisent à "contient 5 caractères suivis de la lettre cible": les caractères 6-9 de la cible doivent contenir la lettre cible (le 5ème caractère de chaque chaîne).
Mise à jour: version de 35 octets ci-dessous, maintenant!
la source
PCRE, 65 octets
C'est une solution vraiment triviale - et pas très intelligente du tout - mais je vais essayer de jouer au golf.
V:
L:
S:
P:
R:
Chaque regex a essentiellement un "identifiant", sous la forme d'un commentaire, qui indique aux autres regex si elles doivent être mises en correspondance ou non.
la source
.NET, 50 octets
Dans l'ordre ils sont
R, P, S, L, V
.Fonctionne en recherchant le groupe d'identifiants (par exemple,
[^R]
) dans chacune des autres expressions.Changer les expressions en
^R|\^[SL]
, ou similaire, semble fonctionner, mais ensuite, cela ressemble un peu trop à la réponse de @ dzaima, bien qu'elle atteigne 45 octets.la source
Vanilla RE, 40 caractères
Pas la solution la plus concise ou élégante, mais une structure visuelle quasi sémantique agréable!
Battements de roche Ciseaux ou Lézard
battements de papier Vulcan ou
Ciseaux de roche bat Lézard ou
Lézards de papier bat papier ou Vulcain
Vulcain bat de roche ou Ciseaux
la source
POSIX, 35 octets
Une façon complètement différente de "se cacher" derrière un symbole de début / fin, donc je me sens bien à ce sujet :) Je m'apparente pour commencer parce que "?" devrait toujours aller entre letter et end / $ si on le faisait dans l’autre sens.
10 octets de moins que ma 1ère solution, et conceptuellement simple, ce qui est un bonus que j'aime bien.
la source