RodionGork's blog

By RodionGork, 13 years ago, In Russian

Введение

Попробовал задачи с 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                     |
                              |

  • Vote: I like it
  • +22
  • Vote: I do not like it