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 балів.
.
означає ціле число виводу, але якщо ви починаєте з верхнього лівого кута, то в стеку немає цілого числа для виведення.
.
виводить ціле число. Але також, коли на стеку недостатньо параметрів, befunge робить вигляд, що натомість є достатня кількість нулів. Отже, другий приклад мав би результат 000
.
g
і p
заборонено (вибачте, забули про них; відредаговано).