Потому что мы не можем насытиться эзотерическими языками, не так ли?
/// - произносится косая черта - забавный маленький язык, основанный на s///
функции замены регулярных выражений славы Perl. Он содержит только два специальных символа, косую черту /
и обратную косую черту \
. Вы можете найти полную статью об этом на вики- сайте esolangs , но я приведу описание языка ниже, а также некоторые примеры.
Короче говоря, это работает, идентифицируя /pattern/repl/rest
в программе и делая замену столько раз, сколько возможно. Никакие символы не являются специальными, за исключением /
и \
: /
разграничивает шаблоны и замены в программе, а также \
позволяет вставлять литералы /
или \
символы в ваш код. Примечательно, что это не регулярные выражения, а просто подстановки строк.
Ваша задача состоит в том, чтобы создать интерпретатор для языка /// в виде программы, читающей STDIN, или функции, принимающей строковый аргумент, в минимально возможном количестве символов.
Вы можете использовать любой язык, кроме самого ///. Вы не можете использовать любые библиотеки, которые интерпретируют ///; вы можете, однако, использовать регулярные выражения, библиотеки регулярных выражений или библиотеки соответствия строк.
выполнение
Существует четыре состояния: печать , рисунок , замена и замена . В каждом штате, кроме замены :
- Если программа пуста, выполнение останавливается.
- Иначе, если первый символ есть
\
, сделайте что-нибудь со следующим символом (если он есть) и удалите оба из программы. - Иначе, если первый символ есть
/
, удалите его и перейдите к следующему состоянию. - Иначе, сделайте что-нибудь с первым символом и удалите его из программы.
- Повторение.
Состояния циклически изменяются в порядке печати , рисунка , замены и замены .
- В режиме печати «сделать что-то» означает вывод символа.
- В режиме паттерна «сделать что-то» означает добавить символ в текущий паттерн.
- В режиме замены «сделать что-то» означает добавить персонажа к текущей замене.
В режиме замены вы следуете другому набору правил. Повторно заменяйте первое вхождение текущего образца на текущую замену в программе, пока больше не будут возможны замены. В этот момент очистите шаблон и замену и вернитесь в режим печати .
В программе /foo/foobar/foo foo foo
происходит следующее:
/foo/foobar/foo foo foo
foo foo foo
foobar foo foo
foobarbar foo foo
foobarbarbar foo foo
...
Это зацикливается навсегда и никогда не выходит из режима замены . Точно так же, если шаблон пуст, то первое совпадение с пустой строкой - в начале программы - всегда совпадает, поэтому режим замены зацикливается навсегда, никогда не останавливаясь.
Примеры
no
Выход: no
.
/ world! world!/Hello,/ world! world! world!
Выход: Hello, world!
.
/foo/Hello, world!//B\/\\R/foo/B/\R
Выход: Hello, world!
.
a/ab/bbaa/abb
Выход: a
. Программа не останавливается.
//
Выход: нет.
///
Выход: нет. Программа не останавливается.
/\\/good/\/
Выход: good
.
В вики есть также quine, которую вы можете попробовать.
\
экранирует любой следующий за ним символ, в том числе /
, который впоследствии можно использовать как обычно. Хотя это выглядит не так много, это делает /// Тьюринг-завершенным .
///
IDE, что я делаю!
/-/World//--/Hello//--W/--, w/---!
Что не любить? (Попробуйте убрать тире с конца)