introduction
Forte est un langage ésotérique très particulier basé sur le concept de modification des valeurs des nombres. Dans Forte, les nombres ne sont pas des constantes mais des variables, vous pouvez utiliser l' LET
instruction pour leur attribuer de nouvelles valeurs.
Par exemple, après avoir exécuté à LET 2=4-1
partir de maintenant, il 2
prend la valeur de 3
, ce qui signifie que chaque fois que la valeur 2
apparaît dans une expression, elle est plutôt "remplacée" par 3
. L'expression (1+1)*2
serait désormais évaluée à 9
.
Cette instruction dans Forte est utilisée à la fois pour stocker des informations et pour contrôler le flux (les lignes sont numérotées et en modifiant la valeur de leurs nombres, vous pouvez déterminer l'ordre de leur exécution). Dans ce défi, nous ne traiterons pas de ce deuxième aspect.
Le défi
Vous devez écrire un interpréteur pour un sous-ensemble simplifié d' LET
expressions de Forte .
Vous recevrez en entrée une série de lignes suivant cette grammaire:
<line>::= <number>=<expression>
<expression>::= <number>|<expression>+<number>
Remarque: cette grammaire n'est pas valide en Forte car elle manque de numéros de ligne, de LET et de parenthèses (qui sont toujours obligatoires)
Autrement dit, vous n'aurez qu'à gérer le calcul des sommations et l'attribution de valeurs aux nombres. Les parenthèses ne seront pas présentes dans l'entrée, et chaque expression devra être évaluée de gauche à droite: attention aux résultats partiels affectés par les redéfinitions!
Les nombres seront toujours des entiers non négatifs, jusqu'à la limite du type d'entier natif de votre langue (ou 2 ^ 32, selon le plus élevé des deux).
Pour chaque ligne, vous devez sortir le résultat de l'expression et affecter ce résultat à la valeur (éventuellement réaffectée) du premier nombre, ce qui affectera la façon dont les lignes suivantes seront interprétées.
C'est le code-golf , le code le plus court (en octets) gagne!
Autres règles
- Le format d'entrée est flexible, vous pouvez par exemple prendre une seule chaîne avec des sauts de ligne, une liste de chaînes, une liste de listes de nombres ... Il en va de même pour la sortie, tant qu'il est clair quel est le résultat de chaque expression dans l'entrée.
- Vous pouvez soumettre une fonction, un programme complet ou une solution à exécuter dans un environnement REPL en l'appelant une fois pour chaque ligne.
- Les failles standard sont interdites, en particulier vous ne pouvez pas appeler un interprète Forte externe dans votre code.
Exemples
Ils font tous partie de la même entrée. Après chaque ligne, la sortie attendue par rapport à cette ligne est affichée, parfois avec un commentaire indiquant les réaffectations pertinentes (ne faisant pas partie de la sortie requise).
5=4
4
6=5
4 # 5 -> 4
7=1+2+5
7
7=5+2+1
4 # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3 # Remember: 5 -> 4
10=6+4
3 # 6 -> 4 -> 3, 3+3 = 6 -> 3
0
est valide ("Les nombres seront toujours des entiers non négatifs")
0
un numéro valide?