Golf un interprete viola
Purple è un esolang progettato con due scopi principali:
- Per essere una minimizzazione della melanzana , dal momento che non ci sono abbastanza lingue auto-modificanti in una sola istruzione in giro.
- Ammettere la possibilità di interpreti di golf terrificantemente piccoli . Il mio primo passaggio a un interprete Python 2 ragionevolmente completo è di soli 702 byte, e sono sicuro che un golfista più esperto potrebbe radersi un po 'da quello.
Il tuo obiettivo è scrivere un interprete per questa lingua.
Informazioni su Viola:
Un programma Purple è una sequenza di caratteri posizionati in una matrice di memoria infinita e indirizzabile in modo tale che il primo carattere del programma sia posizionato all'indirizzo zero. Il resto dell'array (sia prima che dopo la memorizzazione del programma Purple) viene inizializzato su zero.
Esistono tre registri in viola, chiamati a e b e i , ognuno dei quali può contenere un numero intero con segno ed è inizializzato su zero. i è anche il puntatore di istruzione, e sempre punti all'istruzione viola attualmente in esecuzione.
Ad ogni ciclo, l'interprete leggerà una sequenza di tre caratteri contigui a partire dalla posizione di memoria indicata dal puntatore dell'istruzione e tenterà di eseguire questa sequenza come l'istruzione Purple. Successivamente, il puntatore dell'istruzione viene sempre incrementato di 3.
Sintatticamente, l'istruzione Purple è composta da tre caratteri (o codifiche degli stessi) di seguito, come " xyz ".
Il primo carattere x può essere uno dei seguenti:
abABio
Questi simboli hanno il seguente significato:
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.
Gli altri due byte y e z possono essere uno dei seguenti:
abABio1
Ognuno di questi simboli ha il seguente significato:
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.
Dopo aver recuperato l'istruzione, l'interprete viola valuterà ye quindi z , sottrarrà il risultato di z dal risultato di y , quindi eseguirà l'azione indicata da x sulla differenza.
Se la sequenza di tre caratteri (o loro codifiche) non è un'istruzione Purple valida, l'interprete si ferma immediatamente senza dare alcun errore.
Il tuo interprete deve:
- Sii un programma completo, non una funzione.
- Non emettere mai su stderr, a meno che non venga letto EOF .
- Comportarsi in modo identico all'implementazione di riferimento su tutti gli input ben formati che non implicano numeri molto grandi, compresi i programmi di test indicati di seguito. (Beh, identicamente all'altezza dei tempi - può funzionare più lentamente, ma non troppo!)
Puoi fornire il programma all'interprete in qualsiasi forma desideri: leggilo da un file, incorporalo nel programma come una stringa o leggilo da stdin.
Casi test:
Il programma
ooo
quando eseguito con input
z!
dovrebbe cedere
Y
Il programma
bbboobiii
quando eseguito con input
It's a cat program.
(o qualsiasi altro input) dovrebbe cedere
It's a cat program.
(o qualunque input ricevuto) e ricominciare da capo e fare di nuovo la stessa cosa .
Il programma
Aoab11bi1bABoAaiba
quando eseguito con input
0
dovrebbe cedere
0
e poi fermarsi, ma quando eseguito con input
1
dovrebbe continuare a produrre
1
per sempre.
Il programma
b1bbb1oAbabaa1ab1Ab1Bi1b
dovrebbe cedere
b1bbb1oAbabaa1ab1Ab1Bi1b
Il programma
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
dovrebbe cedere
Hello, World!
punteggio:
Questo è code-golf , quindi vince la fonte più breve in byte, potenzialmente modificata dal seguente bonus.
Bonus:
- -10% se l'interprete legge un nome file da stdin o da un argomento della riga di comando e carica il programma dal file.
uint32
per i personaggi e MAXINT per gli ints