REGXY, 53 49 octets
Utilise REGXY , un langage basé sur la substitution de regex
//$'#/
/.(.+)#\1\K/#/
a/(#).(.*#)|#.*/$'$1$2/
//a
Présentation:
Un certain nombre d'expressions régulières sont appliquées. Un exemple d'exécution ressemblerait à ceci:
onion (input)
onion#onion (line 1 regex)
onion#on#ion (line 2 regex - find the repeated section and separate with #)
onionion#n#ion (line 3 regex - the length of the middle token is the garland order, remove a character and append the third token onto the original string on the left)
onionionion##ion (line 4 regex is a pointer to line 3 - repeat the previous again)
onionionion##ion (line 4 regex is a pointer to line 3 - strip everything after and including the #)
Explication détaillée Vous
trouverez ci-dessous une ventilation ligne par ligne des expressions rationnelles:
//$'#/
Il s'agit d'une substitution de regex qui correspond à la première chaîne vide (c'est-à-dire le début de la chaîne) et la remplace par tout ce qui se trouve à droite de la correspondance ( $'
) suivi d'un hachage. Par exemple, il se transformera onion
en onion#onion
.
/.(.+)#\1\K/#/
Cette ligne recherche la section qui se chevauche en recherchant un groupe de caractères immédiatement avant le # ( (.+)
) qui sont identiques de l’autre côté du # ( \1
). Le \ K signifie simplement "oublie que je ne correspondais à rien", ce qui signifie qu'il ne sera pas remplacé dans la substitution. Ceci signifie que nous ajoutons simplement un # à la position après que le chevauchement a été trouvé, se transformant onion#onion
en onion#on#ion
.
a/(#).(.*#)|#.*/$'$1$2/
Le 'a' initial est juste une étiquette pour la regex. Après cela, nous trouvons le premier # suivi d'un seul caractère ( .
) et capturons tout ce qui suit jusqu'au prochain # ( .*#
). Nous remplaçons ceci par tout ce qui se trouve à droite du match, c'est-à-dire le dernier jeton ($ '), suivi d'un # ( $1
), suivi du deuxième jeton moins un caractère (nous le traitons comme un compteur, en le diminuant à chaque itération). Dans le cas de l' oignon # sur # ion, les deux jetons que nous backreference sur sont indiqués entre parenthèses, et la section des matches entiers regex est entre les tuyaux: onion|(#)o(n#)|ion
. Nous remplaçons ensuite les bits que nous associons (entre les tuyaux) par $'
(tout à droite du match, c.-à-d. 'Ion'), puis $ 1 (le #), puis $ 2 (n #), ce qui signifie que nous nous retrouvons avec onion|(ion)(#)(n#)|ion
(parenthèses). les trois jetons dans la chaîne de remplacement).
Si la regex ne correspond pas à la première alternance (tout ce qui précède le tube), nous devons avoir diminué notre compteur à zéro, ce qui signifie qu'il n'y a aucun caractère dans le deuxième jeton. , Nous regardons plutôt la deuxième partie du motif, #.*
. Ceci remplace simplement tout après le premier # avec $'$1$2
. Comme il n'y a pas de références arrières créées par cette alternance et qu'il n'y a rien à droite du match ( .*
correspond jusqu'à la fin de la chaîne), nous terminons la correspondance et retournons le résultat.
//a
Ceci est juste un pointeur sur la ligne précédente, assurant que nous continuons à exécuter la substitution de regex jusqu'à ce qu'elle ne corresponde plus.