Napisz tłumacza dla 2B
Lubię ezoteryczny język Davida Catt'a 2B, mając pamięć zapisaną na taśmie, gdzie każda komórka jest oddzielną taśmą bajtów („taśma podrzędna”). Napisz do niego tłumacza!
Specyfikacja języka
Oficjalna specyfikacja znajduje się tutaj . W tej specyfikacji "
oznacza liczbę z zakresu 0-9
( 0
jest interpretowana jako 10
) i _
oznacza ciąg dowolnej długości. Każda komórka przechowuje wartość z zakresu 0-255
, a przepełnienie / niedomiar zawija się, tak jak w przypadku BF. (Dzięki @ MartinBüttner). Aby przekonwertować tekst na liczby 0-255
, użyj kodów ASCII . Ponieważ nie mogę znaleźć żadnych szczegółów na ten temat, powiem, że długość taśmy powinna być 255
minimalna, ale jeśli wiesz inaczej, edytuj.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 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. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Testy
+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)
Powinien wyjść Hello world!
+1:i:{()*i*}
Coś w rodzaju cat
programu, tylko bez nowej linii.
+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*}%
Powinieneś najpierw zaakceptować nazwę, a następnie, po naciśnięciu Return, powinien wypisać Hello name
(gdzie nazwa jest to, co zostało wprowadzone).
Podziękowania dla tego programu należą się Davidowi Cattowi .
Pracuję nad pełnym programem testowym.
Zasady
- Standardowe luki są zabronione
- Twój tłumacz musi spełniać wszystkie specyfikacje, z wyjątkiem komentarzy, które nie są wymagane.
Punktacja
- To jest golf golfowy , więc wygrywa najmniej bajtów!
- -10 bajtów, jeśli Twój tłumacz obsługuje komentarze.
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes