Написать переводчик для 2B
Мне нравится эзотерический язык Дэвида Кэтта 2B, в котором память хранится на ленте, где каждая ячейка представляет собой отдельную ленту байтов («подзаголовок»). Напишите переводчика для этого!
Спецификация языка
Официальную спецификацию можно найти здесь . В этой спецификации "
означает число в диапазоне 0-9
( 0
интерпретируется как 10
) и _
означает строку любой длины. Каждая ячейка хранит значение в диапазоне 0-255
, и переполнение / переполнение оборачивается, как если бы это было BF. (Спасибо @ MartinBüttner). Для преобразования текста в числа 0-255
используйте коды ASCII . Поскольку я не могу найти подробностей об этом, я скажу, что длина ленты должна быть 255
минимальной, но если вы знаете иначе, пожалуйста, отредактируйте.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction | Description |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0 | Zeroes the current cell and clears the overflow/underflow flag. |
| { | If the current cell is zero, jump to the matching }. |
| } | A placeholder for the { instruction. |
| ( | Read a byte from the input stream and place it in the current cell. |
| ) | Write the value of the current cell to the console. |
| x | Store the value of the current cell in a temporary register. |
| o | Write the value of the temporary register to the console. |
| ! | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ? | Performs a binary NOT on the current cell. |
| +" | Adds an amount to the current cell. |
| -" | Subtracts an amount from the current cell. |
| ^" | Moves the subtape up a number of times. |
| V" | Moves the subtape down a number of times. |
| <" | Moves the tape left a number of times. |
| >" | Moves the tape right a number of times. |
| :_: | Defines a label of name _. |
| *_* | Jumps to a label of name _. |
| ~_~ | Defines a function of name _. |
| @_@ | Calls a function of name _. |
| % | Ends a function definition. |
| #_# | Is a comment. |
| [SPACE] | Is an NOP. |
| [NEWLINE] | Is treated as whitespace and removed. |
| [TAB] | Is treated as whitespace and removed. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
тесты
+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)
Должен выводить Hello world!
+1:i:{()*i*}
Вроде cat
программа, просто без перевода строки.
+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%
Сначала следует принять имя, а затем, при нажатии Return, вывести Hello name
(где имя - это то, что было введено).
Кредит на эту программу достается Дэвиду Кэтту .
Я работаю над полной тестовой программой.
правила
- Стандартные лазейки запрещены
- Ваш переводчик должен соответствовать всем техническим требованиям, кроме комментариев, которые не требуются.
счет
- Это код-гольф , поэтому побеждает меньше байтов!
- -10 байт, если ваш переводчик обрабатывает комментарии.
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
источник
Ответы:
Python2,
748736731709704691 байтЭто была небольшая забавная задача, я уверен, что смогу сделать этот код еще короче (возможно, я сделаю это позже).
Эта реализация требует, чтобы метки и функции были объявлены (реализованы) перед вызовом. Он отлично работает с двумя приведенными тестами, но, к сожалению, не работает с программой «SayHi.2b», написанной автором языка (даже после изменения порядка объявления функций). Я думаю, что эта проблема, возможно, связана с тем, как я понял систему лент и подзаголовков. При перемещении вдоль основной ленты положение на соответствующем подзаголовке сбрасывается в 0? На данный момент я сохраняю позицию на подзаголовке, даже когда двигаюсь по основной ленте.
Вот более читаемая версия:
Изменить: Учитывать обработку комментариев (-10 байт), исправляя отключение одной ошибкой. Эта реализация не поддерживает вызовы вложенных функций (я мог бы реализовать это, если это требуется)
Edit2: изменена функция обработчика для добавления, вычитания и перемещения ячеек. Больше лямбд! : D («более читаемая версия» теперь может быть не синхронизирована)
Edit3: я только что понял, что обработка комментариев стоит мне 5 байтов (с учетом -10). Так что я просто удалил его, жаль, что теперь он кажется неполным.
Edit4: перенес определение n из лямбды в var внутри обработчика h ()
источник
+a+
может быть лучше присоединитьсяa
? Это также избавило бы вас от необходимости присваивать его переменной.SayHi.2b
файл работал. Что произойдет, если его изменить, чтобы сбросить подзапись на ноль за смену?