Parce que nous ne pouvons pas en avoir assez des golfs en langue ésotérique, n'est-ce pas?
/// - prononcé des barres obliques -est un langage peu amusant basé sur la s///
fonction regex-remplacement de la renommée Perl. Il ne contient que deux caractères spéciaux, barre oblique /
et barre oblique inverse \
. Vous pouvez trouver un article complet à ce sujet sur le wiki esolangs , mais je vais reproduire une description du langage ci-dessous, ainsi que quelques exemples.
En bref, cela fonctionne en s'identifiant /pattern/repl/rest
dans le programme et en effectuant la substitution autant de fois que possible. Aucun caractère n'est spécial sauf /
et \
: /
délimite les modèles et les remplacements dans le programme, tandis que \
vous permet d'insérer des littéraux /
ou des \
caractères dans votre code. Notamment, ce ne sont pas des expressions régulières, juste des substitutions de chaînes simples.
Votre défi est de produire un interpréteur pour le langage ///, soit un programme lisant STDIN soit une fonction prenant un argument chaîne, en le moins de caractères possible.
Vous pouvez utiliser n'importe quelle langue à l'exception de /// lui-même. Vous ne pouvez utiliser aucune bibliothèque interprétant ///; vous pouvez cependant utiliser des expressions régulières, des bibliothèques d'expressions régulières ou des bibliothèques de correspondance de chaînes.
Exécution
Il existe quatre états: impression , motif , remplacement et substitution . Dans tous les états sauf substitution :
- Si le programme est vide, l'exécution s'arrête.
- Sinon, si le premier caractère est
\
, faites quelque chose avec le caractère suivant (s'il est présent) et supprimez les deux du programme. - Sinon, si le premier caractère est
/
, supprimez-le et passez à l'état suivant. - Sinon, faites quelque chose avec le premier caractère et supprimez-le du programme.
- Répéter.
Les états font défiler l' impression , le motif , le remplacement et la substitution dans l'ordre.
- En mode d' impression , «faire quelque chose» signifie sortir le caractère.
- En mode modèle , «faire quelque chose» signifie ajouter le caractère au modèle actuel.
- En mode de remplacement , «faire quelque chose» signifie ajouter le personnage au remplacement actuel.
En mode substitution , vous suivez un ensemble de règles différent. Remplacez à plusieurs reprises la première occurrence du modèle actuel par le remplacement actuel dans le programme, jusqu'à ce qu'aucune substitution ne soit possible. À ce stade, effacez le motif et le remplacement et revenez en mode d' impression .
Dans le programme /foo/foobar/foo foo foo
, les événements suivants se produisent:
/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...
Cela boucle pour toujours et ne quitte jamais le mode de substitution . De même, si le Pattern est vide, la première occurrence de la chaîne vide - au début du programme - correspond toujours, donc le mode de substitution boucle pour toujours, sans jamais s'arrêter.
Exemples
no
Sortie: no
.
/ world! world!/Hello,/ world! world! world!
Sortie: Hello, world!
.
/foo/Hello, world!//B\/\\R/foo/B/\R
Sortie: Hello, world!
.
a/ab/bbaa/abb
Sortie: a
. Le programme ne s'arrête pas.
//
Sortie: aucune.
///
Sortie: aucune. Le programme ne s'arrête pas.
/\\/good/\/
Sortie: good
.
Il y a aussi une quine sur le wiki que vous pouvez essayer.
\
personnage échappe à tout personnage qui le suit, y compris /
, qui peut ensuite être utilisé normalement. Bien que cela ne ressemble pas beaucoup, cela rend /// Turing-complet .
///
IDE que je fais!
/-/World//--/Hello//--W/--, w/---!
Qu'est-ce qu'il n'y a pas à aimer? (Essayez de supprimer les tirets de la fin)