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.
la source
Réponses:
Rubis, 182 octets
Essayez-le comme ceci:
Comment ça marche
La
r
fonction tokenize une chaîne d'entrée et exécute chaque token:Nous recherchons une
$2
correspondance de nom de variable[^!?^<>]*
, suivie soit<...>
où...
correspond à zéro ou plusieurs programmes (\g
est la récursivité), auquel cas$4
n'est pasnil
!
,?
ou^
caractère capturé par$3
, auquel cas il l'$4
estnil
.Ensuite, la logique d'exécution d'un jeton est assez simple lors de son retrait un peu:
la source
JavaScript (ES6) 184
194 209Édition simplifiée (l'utilisation des paramètres de fonction pour l'entrée et la sortie semblait une bonne idée, mais ce n'était pas le cas), 1 octet de plus enregistré thx @ ӍѲꝆΛҐӍΛПҒЦꝆ
Edit 2 Parsing modifié. La logique d'incrémentation / entrée est empruntée à la réponse de @ Lynn
Moins golfé
TEST L'extrait commence à évaluer 2016 à l'aide du programme publié par @Neil. Sois patient...
la source
eval
pour éviterreturn
n'est-il pas une option?Perl, 251 octets
Version plus facile à lire:
Cela gaspille un tas d'octets fixant les boucles pour être des sauts directs, mais le balayage vers l'arrière pour le début de la boucle a offensé mon sens de l'esthétique.
la source
C ++ standard, 400 octets
Cela compile avec
g++ -g test.cpp -Wall -Wextra -pedantic -std=gnu++11
Je pourrais peut-être raccourcir encore un peu. Si vous avez des suggestions, veuillez commenter.
la source