Напишіть перекладача для 2B
Мені подобається езотерична мова 2В Девіда Кетта , що пам'ять зберігається у стрічці, де кожна комірка є окремою стрічкою байтів ("підзаголовок"). Напишіть для нього перекладача!
Специфікація мови
Офіційну специфікацію можна знайти тут . У цій специфікації "
означає число в діапазоні 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 байт, якщо ваш перекладач обробляє коментарі.
Таблиця лідерів
Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.
Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:
# Language Name, N bytes
де N
розмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:
# Ruby, <s>104</s> <s>101</s> 96 bytes