Написать переводчик для 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