Тому що ми не можемо отримати достатню кількість езотеричних мовних гольфів, чи не можемо?
/// - яскраво виражені косої риси - це весела маленька мова, заснована на 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
.
На вікі також є квін, який можна спробувати.
\
уникає будь-якого персонажа, який слідує за ним, у тому числі /
, який згодом може бути використаний як звичайний. Хоча це виглядає не так вже й багато, це робить /// Turing-завершеним .
///
IDE, що я роблю!
/-/World//--/Hello//--W/--, w/---!
Що не любити? (Спробуйте видалити тире з кінця)