Ecco una definizione linguistica molto semplice:
A Variable is any string that does not contain ^, <, >, !, or ?
The empty string is a valid variable identifier
The value of every variable starts at 0.
A Statement is one of (var is a Variable, P is a Program):
var^ -> changes var to be equal to 1 more than itself
var<P> -> while var > 0, changes var to be equal to 1 less than itself, then runs P
var! -> output value of var
var? -> ask for non-negative integer as input, increase var by that value
A Program is a concatenation of Statements, running a Program means running each Statement in order
Programmi di esempio (nota che la stringa vuota è una variabile, ma la userò con parsimonia per motivi di chiarezza e alcune variabili vengono azzerate nel programma quando sono normalmente 0 per impostazione predefinita):
<>: sets the value of the empty string variable to 0
b<>b?b<a^>: asks for b, then adds the value stored in b to a, zeroing b in the process
b<>b?a<>b<a^>: asks for b, then sets a to the value of b, zeroing b in the process
a<>c<>b<a^c^>c<b^> : copies the value in b into a without zeroing it
b<>c<>a<c^c^c<b^>>b! : outputs a multiplied by 2
b^b<a<>a?a!b^> : outputs what you input, forever
Il tuo obiettivo è scrivere l'interprete più piccolo per questa lingua.
Il valore di una variabile può essere arbitrariamente grande e dovrebbe essere limitato solo dalla memoria totale a cui la tua lingua ha accesso, in teoria, ma ti viene richiesto solo di gestire valori fino a 2 ^ 256.
Il tuo programma dovrebbe essere in grado di gestire programmi arbitrariamente lunghi, in teoria, ma ti verrà richiesto di lavorare solo su programmi di lunghezza inferiore a 2 ^ 32 caratteri. È necessario gestire anche cicli annidati di profondità fino a 2 ^ 32.
Puoi presumere che il programma sia un programma valido e che otterrai sempre numeri non negativi solo quando chiedi un input. Puoi anche supporre che nella stringa di input siano inclusi solo caratteri stampabili ASCII.
La velocità del programma che interpreti non ha importanza, sarà già dolorosamente lenta per cose semplici come la moltiplicazione a 5 cifre, senza ottimizzazione.
Se si desidera utilizzare una lingua che non può ragionevolmente accettare input o produrre output nel modo descritto dalla lingua, utilizzare qualsiasi interpretazione che si desidera renderlo possibile. Questo vale per qualsiasi motivo per cui la tua lingua non è in grado di attuare alcuni comportamenti richiesti. Voglio che tutte le lingue possano competere.
Vince il programma più breve. Si applicano scappatoie standard.