introduction
Je ne vois pas beaucoup de défis regex ici, donc je voudrais proposer celui-ci d'une simplicité trompeuse qui peut être fait de plusieurs façons en utilisant un certain nombre de saveurs regex. J'espère que cela offre aux amateurs de regex un peu de plaisir à jouer au golf.
Défi
Le défi est de faire correspondre ce que j'ai très vaguement appelé une série «égalitaire»: une série de nombres égaux de personnages différents. Ceci est mieux décrit avec des exemples.
Rencontre:
aaabbbccc
xyz
iillppddff
ggggggoooooollllllffffff
abc
banana
Ne correspond pas:
aabc
xxxyyzzz
iilllpppddff
ggggggoooooollllllfff
aaaaaabbbccc
aaabbbc
abbaa
aabbbc
Pour généraliser, nous voulons faire correspondre un sujet du formulaire ( pour toute liste de caractères à , où pour tousc1)n(c2)n(c3)n...(ck)n
c1
ck
ci != ci+1
i, k > 1, and n > 0.
Clarifications:
L'entrée ne sera pas vide.
Un caractère peut se répéter plus tard dans la chaîne (par exemple "banane")
k > 1
, il y aura donc toujours au moins 2 caractères différents dans la chaîne.Vous pouvez supposer que seuls les caractères ASCII seront transmis en entrée et aucun caractère ne sera un terminateur de ligne.
Règles
(Merci à Martin Ender pour ce bloc de règles excellemment énoncé)
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 la saveur regex de votre langue qui vous permettent d'invoquer du code dans le langage d'hébergement (par exemple le e
modificateur de Perl ).
Vous pouvez utiliser n'importe quelle saveur regex qui existait avant ce défi, mais veuillez spécifier la saveur.
Ne supposez pas que l'expression régulière est ancrée implicitement, par exemple si vous utilisez Python, supposez que votre expression régulière est utilisée avec re.search et non avec re.match. Votre expression régulière doit correspondre à la chaîne entière pour les chaînes égalitaires valides et ne produire aucune correspondance pour les chaînes non valides. Vous pouvez utiliser autant de groupes de capture que vous le souhaitez.
Vous pouvez supposer que l'entrée sera toujours une chaîne de deux ou plusieurs caractères ASCII ne contenant aucun terminateur de ligne.
C'est le golf regex, donc le regex le plus court en octets gagne. Si votre langue nécessite (généralement /.../
) des délimiteurs pour désigner des 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.
Critères
C'est un bon golf à l'ancienne, alors oubliez l'efficacité et essayez simplement d'obtenir votre regex aussi petit que possible.
Veuillez indiquer la saveur regex que vous avez utilisée et, si possible, inclure un lien montrant une démonstration en ligne de votre expression en action.
banana
est égalitaire.Réponses:
Saveur .NET, 48 octets
Essayez-le en ligne! (en utilisant Retina )
Eh bien, il s'avère que ne pas nier la logique est plus simple après tout. J'en fais une réponse distincte, car les deux approches sont complètement différentes.
Explication
la source
((^.|\2(?=.*\4\3)|\4(?!\3))(?=\2*+((.)\3?)))+\3$
J'expérimentait\3*
en place de le(?!\3)
rendre 45b mais échoue sur « aabbbc » :( La version Perl est plus facile à comprendre, et il est jusqu'à 45b maintenant:^((?=(.)\2*(.))(?=(\2(?4)?\3)(?!\3))\2+)+\3+$
- la raison pour laquelle je l' appelle Perl , même si elle semble être valide PCRE est que PCRE pense qu'il(\2(?4)?\3)
pourrait récurer indéfiniment alors que Perl est un peu plus intelligent / indulgent!Saveur .NET, 54 octets
Essayez-le en ligne! (en utilisant Retina )
Je suis presque sûr que ce n'est pas optimal, mais c'est le meilleur que je trouve pour équilibrer les groupes en ce moment. J'ai une alternative au même nombre d'octets, qui est essentiellement la même:
Explication
L'idée principale est d'inverser le problème, de faire correspondre des chaînes non égalitaires et de mettre le tout dans une position négative pour annuler le résultat. L'avantage est que nous n'avons pas à garder une trace de n tout au long de la chaîne (car en raison de la nature des groupes d'équilibrage, vous consommez généralement n lors de la vérification), pour vérifier que toutes les exécutions sont de longueur égale. Au lieu de cela, nous recherchons simplement une seule paire de pistes adjacentes qui n'ont pas la même longueur. De cette façon, j'ai seulement besoin d'utiliser n qu'une seule fois.
Voici une ventilation de l'expression régulière.
la source
banana
,aba
,bbbaaannnaaannnaaa
,bbbaaannnaaannnaaaaaa
,The Nineteenth Byte
,11
,110
,^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+
,bababa
. C'est moi qui ai échoué. :( +1