Befunge - это двумерный эзотерический язык программирования. Основная идея заключается в том, что (односимвольные) команды размещаются на двумерной сетке. Поток управления проходит по сетке, выполняя команды, через которые он проходит, и изменяя направление, когда ударяет стрелку ( >^<v
). Команды основаны на стеке; увидеть этот список . Смотрите также http://esolangs.org/wiki/Befunge .
Спецификация для Befunge-98 доступна.
проблема
Напишите программу, которая преобразует программу Befunge в более компактное представление. Например, следующая программа печатает 0
:
> 0 v
> @ .
^ <
В этом случае его можно сжать без изменения поведения программы, удалив строки пробелов, чтобы
>0v
>@.
^ <
Более сложные преобразования могут вращать или отражать последовательности команд и исключать ненужные команды потока управления для сжатия программы. Например, с помощью этой программы:
>12345v
6
v....7<
.
.
.
@
вы можете заправить конец программы в отверстие:
>12345v
>...@ 6
^....7<
Для первого примера самая компактная из возможных программ
>0.@
Вы можете использовать любые преобразования, если программа вывода дает тот же результат.
Входные программы
Программы ввода являются действительными программами Befunge-98.
Вы можете предположить, что входная программа является детерминированной. То есть он не использует команды, которые читают внешнее состояние: команды пользовательского ввода &
и ~
, рандомизатор ?
и команды самоизменяющегося кода p
и g
.
Вы можете предположить, что входная программа завершается.
счет
Это не кодовый гольф, а проблема в написании программы, которая выполняет кодовый гольф.
Входные данные представляют собой набор тестовых случаев (программы Befunge, которые удовлетворяют ограничениям ввода, указанным выше). Общий балл - это сумма баллов за тестовые случаи.
Оценка для каждого теста
Оценка - это площадь выпуклой оболочки непустых ячеек в выходной программе, где каждая ячейка рассматривается как квадрат, четыре угла которого являются точками решетки в декартовой плоскости. Например, программа
> v
@ <
получает оценку 9,5.
Если ваша программа не завершает в разумных количествах времени и памяти на конкретном входе, оценка - это входная программа. (Это потому, что вы можете просто добавить ограничивающую время оболочку, которая выводит входную программу без изменений, если ваша программа не завершает работу во времени.)
Если программа тестового примера имеет другой результат (или не может завершиться) после обработки вашей программой, результатом является оценка входной программы плюс штраф в 100 баллов.
.
означает выходное целое число, но если вы начинаете сверху слева, то в стеке нет целого числа для вывода.
.
выводит целое число. Но также, когда в стеке недостаточно параметров, имейте в виду, что вместо этого там достаточно нулей. Таким образом, второй пример будет выводить 000
.
g
и p
не допускаются (извините, забыл о них; отредактировано).