REGXY, 53 49 byte
Utilizza REGXY , un linguaggio basato sulla sostituzione regex
//$'#/
/.(.+)#\1\K/#/
a/(#).(.*#)|#.*/$'$1$2/
//a
Panoramica:
vengono applicate alcune espressioni regolari. Un esempio di esecuzione sarebbe simile a:
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 #)
Spiegazione dettagliata
Quanto segue è una ripartizione riga per riga delle regex:
//$'#/
Questa è una sostituzione regex che corrisponde alla prima stringa vuota (cioè l'inizio della stringa) e la sostituisce con tutto a destra della corrispondenza ( $'
) seguito da un hash. Ad esempio, si trasformerà onion
in onion#onion
.
/.(.+)#\1\K/#/
Questa riga trova la sezione che si sovrappone cercando un gruppo di caratteri che precede immediatamente # ( (.+)
) che sono gli stessi sull'altro lato di # ( \1
). Il \ K significa semplicemente "dimentica che ho abbinato qualsiasi cosa", il che significa che non verrà effettivamente sostituito nella sostituzione. Questo in modo efficace, questo significa che aggiungiamo solo un # alla posizione dopo che la sovrapposizione è stata trovata, girandoonion#onion
in onion#on#ion
.
a/(#).(.*#)|#.*/$'$1$2/
La "a" iniziale è solo un'etichetta per la regex. Dopo questo, troviamo il primo # seguito da un singolo carattere ( .
) e catturiamo tutto dopo questo fino al successivo # ( .*#
). Sostituiamo questo con tutto a destra della partita, ovvero l'ultimo token ($ '), seguito da un # ( $1
), seguito dal secondo token meno un carattere (lo trattiamo come un contatore, diminuendolo ogni iterazione). Nel caso di cipolla # su # ione, i due token su cui facciamo riferimento sono mostrati tra parentesi e la sezione a cui corrisponde l'intera regex è tra le pipe:onion|(#)o(n#)|ion
. Sostituiamo quindi i bit che abbiniamo (tra i tubi) con $'
(tutto a destra della corrispondenza, ad esempio 'ion'), quindi $ 1 (il #), quindi $ 2 (n #), il che significa che finiamo con onion|(ion)(#)(n#)|ion
(parentesi mostrate i tre token nella stringa di sostituzione).
Se il regex non riesce ad abbinare nella prima alternanza (tutto prima della pipe), dobbiamo aver ridotto il nostro contatore a zero, il che significa che non ci sono caratteri all'interno del secondo token. Invece, guardiamo la seconda parte del modello, #.*
. Questo semplicemente sostituisce tutto dopo il primo # con $'$1$2
. Poiché non vi sono riferimenti secondari creati da questa alternanza e non esiste nulla a destra della corrispondenza ( .*
corrispondenze fino alla fine della stringa), terminiamo la corrispondenza e restituiamo il risultato.
//a
Questo è solo un puntatore alla riga precedente, assicurandoci di continuare ad eseguire la sostituzione regex fino a quando non riesce più a corrispondere.