Porque não podemos obter o suficiente de golfe esotérico, podemos?
/// - barras pronunciadas - é uma linguagem divertida, baseada na s///
função de substituição de expressões regulares da fama do Perl. Ele contém apenas dois caracteres especiais, barra /
e barra invertida \
. Você pode encontrar um artigo completo no wiki do esolangs , mas reproduzirei uma descrição do idioma abaixo, além de alguns exemplos.
Em resumo, ele funciona identificando /pattern/repl/rest
no programa e fazendo a substituição quantas vezes for possível. Nenhum caractere é especial, exceto /
e \
: /
demarca padrões e substituições no programa, enquanto \
permite inserir caracteres /
ou literais \
no seu código. Notavelmente, essas não são expressões regulares, apenas substituições simples de strings.
Seu desafio é produzir um intérprete para a linguagem ///, como um programa que lê STDIN ou uma função que usa um argumento de string, com o menor número de caracteres possível.
Você pode usar qualquer idioma, exceto o ///. Você não pode usar nenhuma biblioteca que interprete ///; você pode, no entanto, usar expressões regulares, bibliotecas de expressões regulares ou bibliotecas de correspondência de cadeias.
Execução
Existem quatro estados, impressão , padrão , substituição e substituição . Em todos os estados, exceto substituição :
- Se o programa estiver vazio, a execução será interrompida.
- Senão, se o primeiro caractere for
\
, faça algo com o próximo caractere (se presente) e remova ambos do programa. - Senão, se o primeiro caractere for
/
, remova-o e mude para o próximo estado. - Senão, faça algo com o primeiro caractere e remova-o do programa.
- Repetir.
Os estados alternam entre impressão , padrão , substituição e substituição em ordem.
- No modo de impressão , 'fazer alguma coisa' significa gerar o caractere.
- No modo padrão , 'fazer alguma coisa' significa adicionar o caractere ao padrão atual.
- No modo de substituição , 'fazer alguma coisa' significa adicionar o caractere à Substituição atual.
No modo de substituição , você segue um conjunto diferente de regras. Substitua repetidamente a primeira ocorrência do padrão atual pela substituição atual no programa, até que não sejam possíveis mais substituições. Nesse ponto, limpe o Padrão e a Substituição e retorne ao modo de impressão .
No programa /foo/foobar/foo foo foo
, acontece o seguinte:
/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...
Isso faz um loop para sempre e nunca sai do modo de substituição . Da mesma forma, se o Padrão estiver vazio, a primeira ocorrência da sequência vazia - no início do programa - sempre corresponderá, portanto o modo de substituição será repetido para sempre, sem parar.
Exemplos
no
Saída: no
.
/ world! world!/Hello,/ world! world! world!
Saída: Hello, world!
.
/foo/Hello, world!//B\/\\R/foo/B/\R
Saída: Hello, world!
.
a/ab/bbaa/abb
Saída: a
. Programa não para.
//
Saída: nenhuma.
///
Saída: nenhuma. Programa não para.
/\\/good/\/
Saída: good
.
Há também um quine no wiki que você pode tentar.
\
caractere escapa de qualquer caractere que o segue, inclusive /
, que pode ser usado posteriormente normalmente. Embora isso não pareça muito, isso faz com que o /// Turing seja completo .
///
IDE que estou criando!
/-/World//--/Hello//--W/--, w/---!
O que há para não amar? (Tente remover traços do final)