Voglio provare un nuovo tipo di sfida golf regex, che ti chiede di risolvere compiti computazionali non banali con nient'altro che sostituzione regex. Per rendere questo più possibile e meno complicato, ti sarà permesso applicare più sostituzioni, una dopo l'altra.
La sfida
Inizieremo semplice: data una stringa contenente due numeri interi positivi, come numeri decimali separati da a ,
, produce una stringa contenente la loro somma, anche come numero decimale. Quindi, molto semplicemente
47,987
dovrebbe trasformarsi in
1034
La tua risposta dovrebbe funzionare per interi positivi arbitrari.
Il formato
Ogni risposta dovrebbe essere una sequenza di passaggi di sostituzione, ciascuno composto da una regex e una stringa di sostituzione. Facoltativamente, per ciascuno di quei passaggi della sequenza, è possibile scegliere di ripetere la sostituzione fino a quando la stringa non smette di cambiare. Ecco un esempio di presentazione (che non risolve il problema sopra):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Dato l'input 123,456
, questo invio elaborerà l'input come segue: la prima sostituzione viene applicata una volta e produce:
|123,|456
Ora la seconda sostituzione viene applicata in un ciclo fino a quando la stringa smette di cambiare:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
E infine, la terza sostituzione viene applicata una volta:
111111
Si noti che il criterio di terminazione per i loop è se la stringa cambia, non se il regex ha trovato una corrispondenza. (Cioè, potrebbe anche terminare se trovi una corrispondenza ma la sostituzione è identica alla partita.)
punteggio
Il tuo punteggio principale sarà il numero di passaggi di sostituzione nella tua presentazione. Ogni sostituzione ripetuta conterà per 10 passaggi. Quindi l'esempio sopra avrebbe segnato 1 + 10 + 1 = 12
.
Nel caso (non troppo improbabile) di un pareggio, il punteggio secondario è la somma delle dimensioni di tutti i passaggi. Per ogni passaggio aggiungi regex ( senza delimitatori), i modificatori e la stringa di sostituzione. Per l'esempio sopra questo sarebbe (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Regole varie
Puoi usare qualsiasi sapore regex (che dovresti indicare), ma tutti i passaggi devono usare lo stesso sapore. Inoltre, è necessario non usare tutte le funzioni del linguaggio host del sapore, come callback di ricambio o di Perl e
modificatore, che valuta il codice Perl. Tutta la manipolazione deve avvenire esclusivamente mediante sostituzione regex.
Nota che dipende dal tuo sapore e dai modificatori se ogni singola sostituzione sostituisce tutte le occorrenze o solo una singola. Ad esempio, se si sceglie il sapore ECMAScript, per impostazione predefinita un solo passaggio sostituirà una sola occorrenza, a meno che non si utilizzi il g
modificatore. D'altra parte, se si utilizza il sapore .NET, ogni passaggio sostituirà sempre tutte le occorrenze.
Per le lingue che hanno diversi metodi di sostituzione per la sostituzione singola e globale (ad es. Ruby sub
vs. gsub
), supponiamo che la sostituzione singola sia predefinita e trattano la sostituzione globale come un g
modificatore.
analisi
Se il sapore che hai scelto è .NET o ECMAScript, puoi utilizzare Retina per testare la tua proposta (mi è stato detto che funziona anche su Mono). Per altri gusti, probabilmente dovrai scrivere un piccolo programma nella lingua host che applica le sostituzioni in ordine. In tal caso, includere questo programma di test nella risposta.