Voici une définition de langage très simple:
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
Exemples de programmes (notez que la chaîne vide est une variable, mais je vais l'utiliser avec parcimonie par souci de clarté, et certaines variables sont remises à zéro dans le programme lorsqu'elles sont généralement égales à 0 par défaut):
<>: 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
Votre objectif est d'écrire le plus petit interprète pour cette langue.
La valeur d'une variable peut être arbitrairement grande et ne devrait être limitée que par la mémoire totale à laquelle votre langue a accès, en théorie, mais vous n'êtes tenu de gérer que des valeurs allant jusqu'à 2 ^ 256.
Votre programme devrait être capable de gérer des programmes arbitrairement longs, en théorie, mais vous ne devrez travailler que sur des programmes de moins de 2 ^ 32 caractères. Vous devez également gérer des boucles imbriquées d'une profondeur allant jusqu'à 2 ^ 32.
Vous pouvez supposer que le programme est un programme valide et que vous n'obtiendrez que des nombres entiers non négatifs lorsque vous demandez une entrée. Vous pouvez également supposer que seuls les caractères imprimables ASCII sont inclus dans la chaîne d'entrée.
La vitesse du programme que vous interprétez n'a pas d'importance, il sera déjà douloureusement lent pour des choses aussi simples qu'une multiplication à 5 chiffres, sans optimisation.
Si vous souhaitez utiliser une langue qui ne peut raisonnablement accepter une entrée ou produire une sortie de la manière décrite par la langue, utilisez toute interprétation que vous souhaitez rendre possible. Cela s'applique à toute raison pour laquelle votre langue ne peut pas implémenter un comportement requis. Je veux que toutes les langues puissent être compétitives.
Le programme le plus court gagne. Des échappatoires standard s'appliquent.