Le défi
Étant donné une expression régulière valide, affichez une expression régulière qui correspond au même ensemble de chaînes, mais inversée.
La tâche
Ce défi utilise le plus les opérations de base regex: ^
, $
, ?
, +
, *
, []
, {}
, |
. Il n'y a rien de tel que des groupes de capture ou tout ce genre de choses compliquées. Les caractères spéciaux peuvent être échappés.
Exemple d'entrée / sortie
Remarque: Une entrée non valide ne sera jamais donnée, et il y a généralement plusieurs réponses possibles pour une entrée donnée!
Input | Sample Output
-----------|-------------
abc | cba
tuv? | v?ut
a(b|c) | (c|b)a
1[23] | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$ | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2} | p{2}
q{7,} | q{7,}
\[c[de] | [de]c\[
ab[c | <output undefined>
a(?bc) | <output undefined>
a[]]bc | <output undefined>
Démo
Démo de travail qui montre les entrées / sorties correctes. Cela a une logique supplémentaire pour valider les entrées qui n'est pas nécessaire dans une vraie réponse. Considérez les entrées non valides comme un comportement non défini.
Détails
Par souci de simplicité, tous les caractères spéciaux ont leur signification particulière ou sont échappés; c'est-à-dire, [[]
n'est pas une plage de caractères pour [
. Les plages de longueurs proviennent des ERE POSIX standard; c'est-à- {n}
dire {n,}
, et {n,m}
sont pris en charge. Les caractères varient []
et [^]
sont pris en charge. En raison de ces règles, et comme aucune entrée non valide n'est fournie, vous n'avez vraiment besoin que de copier le contenu de celles-ci directement dans la sortie. Enfin, la gourmandise n'a pas d'importance, c'est-à-dire que peu importe si l'expression régulière inversée trouve d'abord une correspondance différente , il lui suffit de trouver une correspondance pour le même ensemble de chaînes.
Notation
Le plus petit programme en octets (sauf la tricherie comme les requêtes réseau) gagne. Le programme peut soit utiliser de vraies E / S, soit simplement définir une fonction.
?
s'attacher. Essayez de taper/a(?bc)/
dans la console du navigateur.(^a|b)(c$|d)
un cas de test.(a)?(b)+
↦(b)+(a)?
?()
, ce qui est utilisé dans votre exemple.Réponses:
Rétine ,
136114110 110 octetsYo dawg, je vous ai entendu comme regex ...
Où
<empty>
représente une ligne de fin vide. Exécutez le code à partir d'un seul fichier avec l'-s
indicateur.... lorsque vous voulez inverser l'expression régulière, vous devez utiliser l'expression régulière. Lorsque vous voulez utiliser regex, vous devez utiliser un langage de programmation basé sur regex.
Ce code suppose que l'entrée ne contient ni
;
ni!
ni ni espaces. Bien que je convienne que c'est une hypothèse assez forte et potentiellement invalide, vous pouvez remplacer ces trois dans le code par trois caractères non imprimables (comme les octets nuls, le caractère de cloche,<DEL>
vous l' appelez ), et cela n'affecterait pas la taille ou la fonctionnalité du code du tout.J'ajouterai une explication quand j'aurai fini de jouer au golf.
la source
]]]
, de toute façon, cette réponse n'aura pas besoin de beaucoup de modifications.)JavaScript ES6, 574 octets
Je peux probablement supprimer quelques
var
déclarations.JS ES6, non testé, 559 octets
Testera à la maison.
JavaScript ES5, non golfé, 961 octets
la source
JavaScript ES6, 343 octets
Code d'origine (les fonctions, mais sans
prompt
):Le code est implémenté comme un analyseur récursif descendant, il peut donc provoquer un débordement de pile sur une entrée profondément imbriquée.
Le code peut provoquer une boucle infinie dans des cas invalides, car je ne les teste pas, profitant de la clause "comportement indéfini".
la source
Python 3, 144 octets
(Celui-ci ne prend pas en charge les qualificatifs sur un groupe comme
(a)+(b)*(cde)?
.)Cas de test:
Résultat:
la source