Це тижневий виклик №2. Тема: Переклад
Напишіть програму або функцію, яка приймає вихідний код для програми в Prelude і виводить код для еквівалентної програми в Befunge-93 . Щоб програма була еквівалентною, вона повинна при будь-якому даному введенні виробляти той самий вихід, що і програма Prelude, і зупинятися, якщо і лише тоді, коли програма Prelude зупиняється.
Мова введення: Прелюдія
Інтерпретатор Python:
Програма Prelude складається з декількох "голосів", які виконують інструкції одночасно. Інструкції для кожного голосу знаходяться в окремому рядку. Кожен голос має окремий стек, який ініціалізується з нескінченною кількістю нулів. Виконання починається в крайньому лівому стовпчику і просуває по одному стовпчику праворуч кожну галочку, за винятком випадків, коли під впливом )
чи (
інструкціями. Програма завершується, коли досягнуто останнього стовпця.
Прелюдія для цього виклику:
Digits 0-9 Push onto the stack a number from 0 to 9. Only single-digit
numeric literals can be used.
^ Push onto the stack the top value of the stack of the above
voice.
v Push onto the stack the top value of the stack of the below
voice.
# Remove the top value from the stack.
+ Pop the top two integers from the stack and push their sum.
- Pop the top two integers from the stack, subtract the topmost
from the second, and push the result.
( If the top of the stack is 0, jump to the column after the
matching `)` after the current column executes.
) If the top of the stack is not 0, jump to the column after
the matching `(` after the current column executes.
? Read an integer from STDIN.
! Pop one value from the stack and print it to STDOUT as an
integer.
<space> No-op
Примітки
v
і^
діють циклічно, томуv
голос внизу копіюватиме елемент стека верхнього голосу, а^
верхній - копіювати з нижнього. Слідство: Якv
і^
дублювати вершини стека в одній голосової програмі.- А
(
та його відповідність)
можуть розташовуватися на різних лініях. Тим НЕ менше ,)
завжди буде дивитися на стосі голосу , де відповідного(
містився, а НЕ стек , де)
сам поміщається. - Значення, отримані вказівками
^
таv
інструкціями, діють на значення, наявні до завершення будь-яких інших операцій у цьому ж стовпці. ?
і!
діють по-іншому, ніж специфікація, знайдена на esolangs.org, тому не забудьте протестувати з трохи модифікованим перекладачем, наданим у цій публікації.
Гарантоване введення:
- Узгодження дужок
- У колоні не більше однієї дужки
- Однакова кількість символів у кожному рядку
- Принаймні один рядок
- Немає стовпця з більш ніж однією інструкцією I / O (
!
або?
) - Один символ передачі ліній після інструкцій для кожного голосу
- Немає жодних символів, крім зазначених вище
Мова виводу: Befunge-93
Befunge - мова на основі стека, лічильник програми (ПК; вказівник на поточну інструкцію) вільно рухається по двовимірній сітці. Він починається у верхньому лівому куті, рухаючись праворуч. Ігрове поле тороїдальне, тобто рух ПК обертається навколо обох країв. Befunge також має стек, який ініціалізується на нескінченну кількість нулів. Befunge виконує такі операції:
Ви можете припустити наступні характеристики компілятора / інтерпретатора Befunge-93:
- Цілі ліміти - необмежена точність.
- Він дозволяє сітки будь-якого розміру.
- Координати сітки (для
g
іp
) базуються на 0.
Оцінка балів
З метою запобігання поданням, які просто створюють інтерпретатор Prelude в Befunge та жорстко кодують джерело Prelude до нього, метою буде мінімізувати розмір отриманого вихідного коду Befunge.
Нижче наведено ряд програм Prelude. Ваш перекладач буде працювати над усім цим. Ваш бал - це сума розмірів програм Befunge, за умови, що всі вони дійсні.
Ваш перекладач не повинен бути оптимізований спеціально для цих тестових випадків (наприклад, шляхом жорсткого кодування рукописних програм Befunge для них). Якщо я підозрюю будь-яку відповідь на це, я залишаю за собою право змінювати дані або створювати додаткові.
Приклади введення
Друкувати n-1
вниз до 0
:
?(1-^!)
Логічний І:
? (0)
?(0 )
1 !
Логічний АБО:
? (0)
? (0)
1 1 !
Перевірте парність вхідного сигналу (тобто модуля 2) негативного числа:
?(1-)
^ v
v1-^^-!
Квадрат вводу:
^
^+ !
?(1-)
Надрукуйте n- е число Фібоначчі, де n = 0
відповідає 0 і n = 1
відповідає 1:
0 v+v!
1 ^
?(1-)
Вхід:
1) v # - !
vv (##^v^+)
?(# ^ ##
Відділ для негативних входів:
1 (# 1) v # - 1+)
vv (##^v^+)
? v-(0 # ^ #
?
1+ 1-!
Звичайно, ваша програма повинна проявляти однакову поведінку у всіх випадках, навіть якщо поведінка зразка програми для негативних чисел не вказана.
Нарешті, ваш перекладач не повинен бути необґрунтовано довгим:
- Він повинен міститись у публікації Stack Exchange
- На типовому настільному комп’ютері він повинен обробляти зразки входів за 10 хвилин.
Зауважте, що числовий вхід для Prelude або Befunge подається як необов'язковий знак мінус з наступною однією або кількома десятковими цифрами, а за ними новий рядок. Інший внесок - це невизначена поведінка.
Ви можете написати перекладача будь-якою мовою. Виграє найкоротший перекладений код Befunge.
Таблиця лідерів
- Sp3000 : 16430 байт
1
Внутрішній цикл, тому його не можна натискати. 0 може виходити з нескінченної кількості 0, яка починається на стеках.