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/restnel 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)