Введение
Попробовал задачи с Unknown Language Round #4. Большое спасибо уважаемой коллеге Nickolas - это действительно довольно увлекательно.
Язык здорово смахивает на APL (язык для марсиан и математиков) из-за символьных команд и на FORTH (язык управления радиотелескопами и стиральными машинами) из-за стека, однако из-за малого количества стековых операций (2dup и rot страшно пригодились бы начиная с задачи d) и отсутствия второго стека всё это смотрится бедновато.
Двумерность в этом смысле ничего существенно не меняет - пишем-то всё равно "в одну линию", хоть и кривую.
Однако есть и особенность - инструкция p позволяет, видимо, писать самомодифицирующиеся программы. (правда с таким набором команд это вероятно трудновато) К сожалению эта возможность, видимо, осталась невостребованной в раунде. Если есть любители самомодифицирующихся программулин (кроме меня), то предлагаю попытать силы.
Задача
Написать на Befunge программу, которая перемещает своё собственное тело в другую позицию "доски", после чего продолжает выполняться с этой копии. Таким образом она сможет потихоньку "перемещаться" в пространстве. (Конечно, чем меньше получится - тем круче)
Упрощение
На оригинальном Befunge делать это довольно противно из-за недостатка базовых операций. Поэтому можно рассмотреть решения на "расширенной" версии языка.
Скачать её можно здесь (извините, это гуглдокс - нажать File - Download original).
Дополнительные команды, в основном украденные из стандартного FORTH, приведены ниже. В скобках показана трансформация верхних элементов стека (элемент "a" - это тот, которого операция не касается - т.е. он глубже остальных). В указанном архиве есть демо-программы (с расширением bf) для большинства из этих команд.
"o" - аналог OVER - копирует предпоследний элемент стека наверх (a b c -> a b c b)
"r" - аналог ROT - перемещает третий снизу элемент наверх (a b c d -> a c d b)
"R" - аналог ROT ROT - "поворачивает" три верхних элемента в обратном порядке (a b c d -> a d b c)
";" - аналог 2DUP - дублирует два верхних элемента (a b c - > a b c b c)
"m" - аналог >R - перемещает верхний элемент на доп.стек
"w" - аналог R> - перемещает элемент с верха доп.стека на основной стек
"(" - копирует верхний элемент на верх доп.стека
")" - аналог R@ - копирует элемент с верха доп.стека в основной стек.
"=" - распечатывает текущее состояние доски.
Пример
В вышеупомянутом архиве есть файл selfcopy.bf - пример программы которая копирует несколько первых байт себя самой на 3 строки ниже, после чего распечатывает доску и выходит. Результат её работы выглядит как-то так:
#./befunge.py -w 30 -r 10 selfcopy.bf ------------------------------+ >9m00>;gm;wR3+pw1-(v | ^ \+1\_=@ | | >9m00>;gm | |