Perché non ne abbiamo mai abbastanza di golf in lingua esoterica, vero?
/// - barre pronunciate: è un linguaggio divertente basato sulla s///
funzione di sostituzione regex della fama del Perl. Contiene solo due caratteri speciali, barra /
e barra rovesciata \
. Puoi trovare un articolo completo sul wiki di esolangs , ma riprodurrò una descrizione della lingua qui sotto, così come alcuni esempi.
In breve, funziona identificandosi /pattern/repl/rest
nel programma e effettuando la sostituzione il maggior numero di volte possibile. Nessun carattere è speciale tranne /
e \
: /
delimita schemi e sostituzioni nel programma, mentre \
ti permette di inserire letterali /
o \
caratteri nel tuo codice. In particolare, queste non sono espressioni regolari, ma semplici sostituzioni di stringhe.
La tua sfida è quella di produrre un interprete per il linguaggio ///, come un programma che legge STDIN o una funzione che prende un argomento stringa, nel minor numero di caratteri possibile.
È possibile utilizzare qualsiasi lingua tranne /// stessa. Non è possibile utilizzare librerie che interpretano ///; tuttavia, è possibile utilizzare regex, librerie regex o librerie di corrispondenza delle stringhe.
Esecuzione
Esistono quattro stati: stampa , modello , sostituzione e sostituzione . In ogni stato tranne la sostituzione :
- Se il programma è vuoto, l'esecuzione si interrompe.
- Altrimenti, se il primo personaggio è
\
, fai qualcosa con il personaggio successivo (se presente) e rimuovi entrambi dal programma. - Altrimenti, se il primo personaggio è
/
, rimuovilo e passa allo stato successivo. - Altrimenti, fai qualcosa con il primo personaggio e rimuovilo dal programma.
- Ripetere.
Gli stati si alternano tra stampa , modello , sostituzione e sostituzione in ordine.
- In modalità di stampa , "fai qualcosa" significa emettere il personaggio.
- In modalità Pattern , "fai qualcosa" significa aggiungere il personaggio al Pattern corrente.
- Nella modalità di sostituzione , "fare qualcosa" significa aggiungere il personaggio alla sostituzione corrente.
In modalità sostituzione , segui un diverso set di regole. Sostituire ripetutamente la prima occorrenza del modello corrente con la sostituzione corrente nel programma, fino a quando non sono più possibili sostituzioni. A quel punto, cancellare il motivo e la sostituzione e tornare alla modalità di stampa .
Nel programma /foo/foobar/foo foo foo
, si verifica quanto segue:
/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...
Questo scorre per sempre e non esce mai dalla modalità di sostituzione . Allo stesso modo, se il Pattern è vuoto, allora la prima occorrenza della stringa vuota — all'inizio del programma — corrisponde sempre, quindi la modalità di sostituzione scorre per sempre, senza mai fermarsi.
Esempi
no
Uscita: no
.
/ world! world!/Hello,/ world! world! world!
Uscita: Hello, world!
.
/foo/Hello, world!//B\/\\R/foo/B/\R
Uscita: Hello, world!
.
a/ab/bbaa/abb
Uscita: a
. Il programma non si ferma.
//
Uscita: nessuna.
///
Uscita: nessuna. Il programma non si ferma.
/\\/good/\/
Uscita: good
.
C'è anche un quine sul wiki che puoi provare.
\
personaggio sfugge a qualsiasi personaggio che lo segue, incluso /
, che può essere successivamente utilizzato normalmente. Anche se questo non sembra molto, rende /// Turing-completo .
///
IDE che sto realizzando!
/-/World//--/Hello//--W/--, w/---!
Cosa non è da amare? (Prova a rimuovere i trattini dalla fine)