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
źródło
Odpowiedzi:
Python2,
748736731709704691 bajtówTo było zabawne, małe wyzwanie, jestem pewien, że mogę skrócić ten kod (może zrobię to w pewnym momencie później).
Ta implementacja wymaga deklaracji (implementacji) etykiet i funkcji przed ich wywołaniem. Działa idealnie z dwoma podanymi testami, ale niestety nie działa z programem „SayHi.2b” napisanym przez autora języka (nawet po zmianie kolejności deklaracji funkcji). Myślę, że ten problem może mieć związek ze sposobem, w jaki rozumiałem system taśm i podtap. Czy przesuwając się wzdłuż głównej taśmy, pozycja na odpowiedniej podtapie jest resetowana do 0? W tej chwili utrzymuję pozycję na taśmie podrzędnej, nawet gdy poruszam się po głównej taśmie.
Oto bardziej czytelna wersja:
Edycja: Weź pod uwagę obsługę komentarzy (-10 bajtów), naprawiając jeden błąd. Ta implementacja nie obsługuje zagnieżdżonych wywołań funkcji (mógłbym ją zaimplementować, jeśli jest to wymagana funkcja)
Edycja2: Zmieniono funkcję modułu obsługi, aby dodawała, odejmowała i przemieszczała komórkę. Więcej lambdów! : D („Bardziej czytelna wersja” może być teraz niezsynchronizowana)
Edycja3: Właśnie zdałem sobie sprawę, że obsługa komentarzy kosztuje mnie 5 bajtów (biorąc pod uwagę -10). Więc właśnie go usunąłem, szkoda, że teraz wydaje się niekompletny.
Edycja4: przeniesiono definicję n z lambda do var w module obsługi h ()
źródło
+a+
może lepiej dołączyća
? Pozbędzie się również konieczności przypisania go do var.SayHi.2b
plik. Co się stanie, jeśli zostanie zmieniony, aby zresetować podtapę do zera podczas zmiany?