Écrivez une expression régulière qui correspond à une chaîne donnée composée de trois entiers non négatifs séparés par des espaces si et seulement si le dernier entier est la somme des deux précédents. Les réponses peuvent être pour des nombres entiers de n'importe quel système numérique avec une radix entre 2 et 10.
Cas de test
Ceux-ci devraient échouer:
0 1 2
10 20 1000
Ceux-ci doivent correspondre:
10 20 30
28657 46368 75025
0 0 0
Règles
Votre réponse doit consister en une seule expression régulière, sans code supplémentaire (sauf, éventuellement, une liste de modificateurs d'expression régulière requis pour faire fonctionner votre solution). Vous ne devez pas utiliser les fonctionnalités de l'argument regex de votre langue qui vous permettent d'invoquer du code dans la langue d'hébergement (par exemple le modificateur e de Perl).
Veuillez spécifier votre saveur regex dans votre réponse.
C'est le golf regex, donc le regex le plus court en octets gagne. Si votre langue nécessite des délimiteurs (généralement /.../) pour désigner les expressions régulières, ne comptez pas les délimiteurs eux-mêmes. Si votre solution nécessite des modificateurs, ajoutez un octet par modificateur.
Crédits à Martin Ender et jaytea pour les règles du regex-golf.
J'ai des raisons de croire que c'est possible sur la base de la solution de Martin Ender pour trouver et incrémenter des entiers avec regex .
la source
/e
modificateur de Perl 5 ne s'applique qu'aux substitutions et n'est pas le seul moyen d'exécuter du code externe. De plus, cela disqualifie entièrement Perl 6 car une expression régulière n'est qu'une méthode avec une syntaxe supplémentaire. (La raison en est que cela rend les expressions rationnelles plus faciles à lire et à écrire) Par conséquent, toutes les fonctionnalités nécessaires dans les expressions régulières archaïques ne sont pas nécessaires (ou incluses) comme vous venez de le mettre en code Perl 6. (ce qui signifie qu'il n'est probablement pas possible de relever ce défi si vous vous limitez au code spécifique regex)/^(\d+)**3%' '$ <?{$0[2]==[+] $0[0,1]}>/
ou/^(\d+)' '(\d+)' '(\d+)$ <?{$2==$0+$1}>/
ou/^(\d+)' '(\d+){}" {$0+$1}"$/
Réponses:
Perl / PCRE: 2 685 octets
Essayez-le en ligne!
J'ai été à l'affût de défis difficiles après une interruption de regex, et je suis tombé sur ce doozy. Vérifier l'ajout (avec Perl / PCRE) est quelque chose auquel j'ai pensé auparavant, mais rapidement rejeté comme impossible ou au-delà de mes capacités. Cependant, j'ai pris une autre fissure maintenant et je suis ravi de dire que je l'ai fait!
Je n'ai pas vraiment joué au golf à part considérer des algorithmes courts et une technique de correspondance globale quand je l'ai écrit. Je suis vraiment content d'avoir réussi: D
Si les gens sont intéressés, je pourrais ajouter des commentaires et expliquer comment cela fonctionne.
Edit: J'ai fait un post détaillé sur mon blog à ce sujet, avec des explications et des commentaires :) profitez-en: http://www.drregex.com/2018/09/a-regex-i-submitted-to-reddit-climbed.html
la source
Arôme .NET,
139111106 + 1 = 107 octetsA besoin du
RightToLeft
modificateurr
. Entrée en binaire.Essayez-le en ligne! (Utilisation de la rétine .)
Oui pour équilibrer les groupes. Je l'expliquerai plus tard ...
Version décimale,
340243 + 1 = 244 octetsEssayez-le en ligne!
la source
.NET, 96 octets
Drapeau:
r
Essayez-le en ligne!
Version décimale, 238 octets
Drapeau:
r
Essayez-le en ligne!
Similaire à la réponse de Martin.
la source