Zagraj w golfa jako Purple Interpreter
Fioletowy to esolang, który został zaprojektowany w dwóch głównych celach:
- Być minimalizacją bakłażana , ponieważ po prostu nie ma wystarczającej ilości samomodyfikujących się języków z jedną instrukcją.
- Przyznać możliwość przerażająco małych golfistów. Moje pierwsze przejście w rozsądnie w pełni funkcjonalnym interpreterze Python 2 to tylko 702 bajty i jestem pewien, że bardziej doświadczony golfista mógłby się z tego trochę zgolić.
Twoim celem jest napisanie tłumacza dla tego języka.
Informacje na temat Purple:
Program Purple to sekwencja znaków umieszczonych w nieskończonej, adresowalnej tablicy pamięci, tak że pierwszy znak programu jest umieszczony pod adresem zero. Reszta tablicy (zarówno przed, jak i po zapisaniu programu Purple) jest inicjowana do zera.
Istnieją trzy rejestry w fioletowy, zwane i b , a ja , z których każdy może posiadać podpisane całkowitą i jest inicjowany do zera. i jest również wskaźnikiem instrukcji i zawsze wskazuje na aktualnie wykonywaną instrukcję Purple.
W każdym cyklu tłumacz interpretuje sekwencję trzech ciągłych znaków rozpoczynających się od miejsca w pamięci wskazanego wskaźnikiem instrukcji i próbuje wykonać tę sekwencję jako instrukcję fioletową. Następnie wskaźnik instrukcji jest zawsze zwiększany o 3.
Składniowo instrukcja Purple składa się z trzech znaków (lub ich kodowań) z rzędu, takich jak „ xyz ”.
Pierwszy znak x może być dowolnym z poniższych:
abABio
Symbole te mają następujące znaczenie:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Pozostałe dwa bajty y i z mogą być dowolnymi z poniższych:
abABio1
Każdy z tych symboli ma następujące znaczenie:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Po pobraniu instrukcji interpreter Fioletowy oceni y, a następnie z , odejmie wynik z od wyniku y , a następnie wykona akcję wskazaną przez x na różnicy.
Jeśli sekwencja trzech znaków (lub ich kodowania) nie jest prawidłową instrukcją w kolorze fioletowym, interpreter zatrzymuje się natychmiast bez żadnych błędów.
Twój tłumacz musi:
- Bądź kompletnym programem, a nie funkcją.
- Nigdy nie wysyłaj do stderr, chyba że EOF zostanie odczytany .
- Zachowuj się identycznie jak implementacja referencyjna na wszystkich dobrze sformułowanych danych wejściowych, które nie obejmują bardzo dużych liczb, w tym programów testowych podanych poniżej. (Cóż, identycznie do czasu - może działać wolniej, ale nie za bardzo!)
Możesz dostarczyć program tłumaczowi w dowolnej formie: odczytać go z pliku, osadzić w programie jako ciąg znaków lub odczytać ze standardowego wejścia.
Przypadki testowe:
Program
ooo
po uruchomieniu z wejściem
z!
powinien ustąpić
Y
Program
bbboobiii
po uruchomieniu z wejściem
It's a cat program.
(lub jakikolwiek inny wkład) powinien dać
It's a cat program.
(lub cokolwiek, co otrzymał), a następnie zacznij od nowa i zrób to samo .
Program
Aoab11bi1bABoAaiba
po uruchomieniu z wejściem
0
powinien ustąpić
0
a następnie zatrzymaj, ale po uruchomieniu z wejściem
1
powinien kontynuować wysyłanie
1
na zawsze.
Program
b1bbb1oAbabaa1ab1Ab1Bi1b
powinien ustąpić
b1bbb1oAbabaa1ab1Ab1Bi1b
Program
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
powinien ustąpić
Hello, World!
Punktacja:
To jest golf golfowy , więc wygrywa najkrótsze źródło w bajtach, potencjalnie zmodyfikowane przez następującą premię.
Premia:
- -10%, jeśli interpreter odczyta nazwę pliku ze standardowego lub argumentu wiersza poleceń i załaduje program z pliku.
uint32
znaków i MAXINT dla ints