Suggerimenti per il golf a Retina


10

Quali consigli generali hai per giocare a golf a Retina ? Sto cercando idee che possano essere applicate ai problemi del codice golf in generale che siano almeno in qualche modo specifiche per Retina (ad esempio "rimuovere i commenti" non è una risposta). Si prega di inviare un suggerimento per risposta.

Per riferimento, il compilatore online è qui .

@ Sp3000 ha sottolineato che ci sono anche suggerimenti per Regex Golf . Le risposte qui dovrebbero focalizzarsi specificamente sulle funzionalità di Retina e non sui consigli generali sul golf regex.



Hmmm, mi sono trattenuto dal pubblicare questo perché Retina è ancora molto in fase di sviluppo e temevo che la maggior parte delle risposte finisse per essere semplici consigli di golf regex, non molto specifici di Retina. Ma potremmo anche provarci, immagino ... :)
Martin Ender,

@ MartinBüttner Tu e alcuni altri mi avete dato molti buoni consigli e suggerimenti da quando ho iniziato a guardare Retina, quindi penso che probabilmente sia giunto il momento per questo. Ho aggiunto un chiarimento sul fatto che i suggerimenti generali sulla regex dovrebbero andare alla domanda collegata.
Trauma digitale

1
@ MartinBüttner Ecco un posto buono come qualsiasi altro a cui chiedere - mi chiedo da un po '- per curiosità qual è l'ispirazione per il nome "Retina"? Presumo che la parte "Re" sia per l'espressione regolare, ma che dire della "tina"?
Trauma digitale

3
@DigitalTrauma Stavo cercando di trovare una bella parola che avrebbe funzionato come acronimo, ma non è riuscita. La parola "retina" era abbastanza vicina ad alcuni dei tentativi, e mi piaceva la parola. Non sono mai riuscito a riconciliarlo in un acronimo però e da allora ho rinunciato a questo. Quindi sì, "re" è una specie di "espressione regolare" e forse la "n" per ".NET", ma alla fine è solo una parola che suonava bene.
Martin Ender,

Risposte:


3

Combina i loop se possibile

Nei calcoli non banali ti troverai spesso a utilizzare diversi loop per elaborare i dati:

+`stage1
+`stage2
+`stage3

Quindi questo funziona stage1fino a quando l'output converge, quindi stage2fino a quando l'output converge e quindi stage3fino a quando l'output converge.

Tuttavia, vale sempre la pena di esaminare le fasi in dettaglio. A volte è possibile eseguire il ciclo in modo intercalato come stage1, stage2, stage3, stage1, stage2, stage3, ...invece (questo dipende molto da ciò che le fasi effettivamente fanno, ma a volte apportano modifiche completamente ortogonali o funzionano bene come pipeline). In questo caso è possibile salvare byte avvolgendoli in un singolo ciclo:

{`stage1
stage2
}`stage3

Se stage1è il primo stadio o stage3è l'ultimo stadio del programma, puoi anche omettere anche quelle parentesi (il che significa che questo può già salvare byte per un ciclo di due stadi).

Un uso recente di questa tecnica può essere visto in questa risposta .


2

Dividere le stringhe in pezzi di uguale lunghezza n

Come nella maggior parte delle lingue "normali" TMTOWTDI (esiste più di un modo per farlo). Suppongo qui che l'input non contenga avanzamenti di riga e che "suddividere" significhi suddividerlo in righe. Ma ci sono due obiettivi abbastanza diversi: se la lunghezza della stringa non è un multiplo della lunghezza del blocco, vuoi mantenere il blocco finale incompleto o vuoi scartarlo?

Mantenere un pezzo finale incompleto

In generale, ci sono tre modi per affrontare la scissione in Retina. Sto presentando tutti e tre gli approcci qui, perché potrebbero fare una differenza maggiore quando provi ad adattarli a un problema correlato. Puoi utilizzare un sostituto e aggiungere un avanzamento riga a ogni corrispondenza:

.{n}
$&¶

Sono 8 byte (o un po 'meno se n = 2o n = 3perché allora puoi usare ..o ...rispettivamente). Questo ha un problema però: aggiunge un ulteriore avanzamento di riga se la lunghezza della stringa è un multiplo della lunghezza del blocco.

Puoi anche utilizzare una fase divisa e sfruttare il fatto che le acquisizioni vengono mantenute nella divisione:

S_`(.{n})

L' _opzione rimuove le righe vuote che altrimenti risulterebbero dalla copertura dell'intera stringa con corrispondenze. Sono 9 byte, ma non aggiunge un avanzamento riga finale. Per i n = 3suoi 8 byte e per i n = 2suoi 7 byte. Nota che puoi salvare un byte complessivo se le linee vuote non contano (ad es. Perché elaborerai solo linee non vuote e in ogni caso eliminerai gli avanzamenti di riga): quindi puoi rimuovere il file _.

La terza opzione è utilizzare una corrispondenza. Con l' !opzione possiamo stampare tutte le partite. Tuttavia, per includere il pezzo finale, dobbiamo consentire una lunghezza di corrispondenza variabile:

M!`.{1,n}

Anche questo è di 9 byte e non includerà un avanzamento riga finale. Questo diventa anche 8 byte n = 3facendo ..?.?. Tuttavia, si noti che si riduce a 6 byte per n = 2perché ora abbiamo solo bisogno ..?. Si noti inoltre che Mpuò essere eliminato se questo è l'ultimo stadio del programma, salvando in ogni caso un byte.

Scartare un pezzo finale incompleto

Questo diventa molto lungo se provi a farlo con una sostituzione, perché devi sostituire il pezzo finale con nulla (se esiste) e anche con una divisione. Quindi possiamo tranquillamente ignorare quelli. È interessante notare che per l'approccio della partita è l'opposto: si accorcia:

M!`.{n}

Ecco 7 byte o meno per n = 2, n = 3. Ancora una volta, nota che puoi omettere Mse questo è l'ultimo stadio del codice.

Se vuoi un feed di riga finale qui, puoi ottenerlo aggiungendo |$a regex.

Bonus: pezzi sovrapposti

Ricorda che Mha l' &opzione che restituisce corrispondenze sovrapposte (che normalmente non è possibile con regex). Ciò consente di ottenere tutti i pezzi sovrapposti (sottostringhe) di una stringa di una determinata lunghezza:

M!&`.{n}

È in qualche modo possibile dividere una stringa esattamente a metà con lunghezza variabile? Quindi 123456diventa 123\n456e 1234567890diventa 12345\n67890?
Kevin Cruijssen,

1
@KevinCruijssen Non credo di aver aggiunto alcuna funzionalità specifica per questo. Probabilmente dovrai usare i gruppi di bilanciamento: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//… Se non ti dispiace un avanzamento riga finale, puoi omettere il ?=.
Martin Ender,

Sono stato in grado di completare la sfida dove pensavo di averne bisogno in modo diverso, ma i gruppi di bilanciamento sono davvero molto utili! Sapevo che doveva essere qualcosa del genere, ma le mie abilità regex / Retina non sono abbastanza buone. Grazie per aver risposto! :)
Kevin Cruijssen il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.