Porque no podemos tener suficiente golf esotérico, ¿verdad?
/// - barras pronunciadas: es un lenguaje pequeño y divertido basado en la s///
función de reemplazo de expresiones regulares de la fama de Perl. Contiene solo dos caracteres especiales, barra /
diagonal y barra diagonal inversa \
. Puede encontrar un artículo completo en el wiki de esolangs , pero reproduciré una descripción del lenguaje a continuación, así como algunos ejemplos.
En resumen, funciona identificando /pattern/repl/rest
en el programa y haciendo la sustitución tantas veces como sea posible. Ningún carácter es especial excepto /
y \
: /
delimita patrones y reemplazos en el programa, mientras le \
permite insertar caracteres literales /
o \
caracteres en su código. Notablemente, estas no son expresiones regulares, solo sustituciones simples de cadenas.
Su desafío es producir un intérprete para el lenguaje ///, ya sea como un programa que lee STDIN o como una función que toma un argumento de cadena, en la menor cantidad de caracteres posible.
Puede usar cualquier idioma excepto /// en sí mismo. No puede usar ninguna biblioteca que interprete ///; sin embargo, puede usar expresiones regulares, bibliotecas de expresiones regulares o bibliotecas de coincidencia de cadenas.
Ejecución
Hay cuatro estados, impresión , patrón , reemplazo y sustitución . En todos los estados excepto la sustitución :
- Si el programa está vacío, la ejecución se detiene.
- De lo contrario, si el primer carácter es
\
, haga algo con el siguiente carácter (si está presente) y elimine ambos del programa. - De lo contrario, si el primer carácter es
/
, elimínelo y cambie al siguiente estado. - De lo contrario, haz algo con el primer personaje y quítalo del programa.
- Repetir.
Los estados se desplazan por la impresión , el patrón , el reemplazo y la sustitución en orden.
- En el modo de impresión , 'hacer algo' significa dar salida al personaje.
- En el modo de patrón , "hacer algo" significa agregar el carácter al patrón actual.
- En el modo de reemplazo , 'hacer algo' significa agregar el personaje al Reemplazo actual.
En el modo de sustitución , sigue un conjunto diferente de reglas. Sustituya repetidamente la primera aparición del Patrón actual con el Reemplazo actual en el programa, hasta que no sean posibles más sustituciones. En ese punto, borre el Patrón y Reemplazo y regrese al modo de impresión .
En el programa /foo/foobar/foo foo foo
, sucede lo siguiente:
/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...
Esto se repite para siempre y nunca sale del modo de sustitución . Del mismo modo, si el Patrón está vacío, la primera aparición de la cadena vacía, al comienzo del programa, siempre coincide, por lo que el modo de sustitución se repite para siempre, sin detenerse nunca.
Ejemplos
no
Salida: no
.
/ world! world!/Hello,/ world! world! world!
Salida: Hello, world!
.
/foo/Hello, world!//B\/\\R/foo/B/\R
Salida: Hello, world!
.
a/ab/bbaa/abb
Salida: a
. El programa no se detiene.
//
Salida: ninguna.
///
Salida: ninguna. El programa no se detiene.
/\\/good/\/
Salida: good
.
También hay una cita en la wiki que puedes probar.
\
personaje escapa a cualquier personaje que lo siga, incluido /
, que luego se puede usar normalmente. Si bien esto no parece mucho, esto hace que /// Turing-complete .
///
IDE que estoy haciendo!
/-/World//--/Hello//--W/--, w/---!
¿Qué no se podría amar? (Intente eliminar guiones desde el final)