En notation de préfixe, l'opérateur précède les arguments, vous pouvez donc imaginer que l'opérateur appelle next()
ce qui est appelé récursivement. En notation infixe, l'opérateur passe entre les arguments, vous pouvez donc l'imaginer simplement comme un arbre d'analyse. En notation postfixe, l'opérateur vient après les arguments, vous pouvez donc l'imaginer comme basé sur la pile.
Dans la notation anyfix, l'opérateur peut aller n'importe où * . Si un opérateur apparaît et qu'il n'y a pas assez d'arguments, alors l'opérateur attend qu'il y ait suffisamment d'arguments. Pour ce défi, vous devez implémenter un évaluateur anyfix très basique. (Notez que anyfix est un langage récréatif que j'ai abandonné avec lequel vous pouvez jouer ici ou vérifier ici )
Vous devrez prendre en charge les commandes suivantes:
(Arity 1)
- dupliquer
- négatif
(Arity 2)
- une addition
- multiplication
- égalité: retourne
0
ou1
.
Vous pouvez choisir d'utiliser cinq symboles non blancs pour ces commandes. À des fins de démonstration, je vais utiliser "
comme doublon, ×
comme multiplication et +
comme ajout.
Pour les littéraux, vous devez uniquement prendre en charge les entiers non négatifs, mais votre interprète doit pouvoir contenir tous les entiers (dans la plage d'entiers (raisonnable) de votre langue).
Jetons un coup d' oeil à un exemple: 10+5
. Le stockage doit se comporter comme une pile et non comme une file d'attente. Donc, tout d'abord, la pile commence à []
et la liste des opérateurs en file d'attente commence à []
. Ensuite, le littéral 10
est évalué, ce qui fait la pile [10]
. Ensuite, l'opérateur +
est évalué, ce qui nécessite deux arguments. Cependant, il n'y a qu'un seul argument sur la pile, donc la liste des opérateurs en file d'attente devient ['+']
. Ensuite, le littéral 5
est évalué, ce qui fait la pile [10, 5]
. À ce stade, l'opérateur '+'
peut être évalué tel quel, créant ainsi la pile [15]
et la file d'attente []
.
Devrait être le résultat final [15]
pour + 10 5
, 10 + 5
et 10 5 +
.
Jetons un coup d' oeil à un exemple plus difficile: 10+"
. La pile et la file d'attente commencent comme []
et []
. 10
est évalué en premier ce qui fait la pile [10]
. Ensuite, +
est évalué, ce qui ne change pas la pile (car il n'y a pas assez d'arguments) et fait la file d'attente ['+']
. Ensuite, "
est évalué. Cela peut s'exécuter immédiatement, ce qui rend la pile [10, 10]
. +
peut maintenant être évalué de sorte que la pile devient [20]
et la file d'attente []
. Le résultat final est [20]
.
Et l'ordre des opérations?
Jetons un coup d'oeil ×+"10 10
. La pile et la file d'attente commencent à la fois comme []
:
×
: La pile est inchangée et la file d'attente devient['×']
.+
: La pile est inchangée et la file d'attente devient['×', '+']
."
: La pile est inchangée et la file d'attente devient['×', '+', '"']
.10
: La pile devient[10]
. Même s'il×
doit être le premier opérateur à être évalué car il apparaît en premier, il"
peut s'exécuter immédiatement et aucun des opérateurs avant lui, il est donc évalué. La pile devient[10, 10]
et la file d'attente['×', '+']
.×
peut maintenant être évalué, ce qui rend la pile[100]
et la file d'attente['+']
.10
: La pile devient[100, 10]
, ce qui permet+
d'être évaluée. La pile devient[110]
et la file d'attente[]
.
Le résultat final est [110]
.
Les commandes utilisées dans ces démonstrations sont cohérentes avec celles du langage anyfix; cependant, le dernier exemple ne fonctionnera pas en raison d'un bogue dans mon interprète. (Avertissement: Vos soumissions ne seront pas utilisées dans l'interpréteur anyfix)
Défi
Sélectionnez un ensemble de 5 caractères non blancs non numériques et créez un interpréteur anyfix selon les spécifications ci-dessus. Votre programme peut soit sortir le tableau singulier, soit la valeur qu'il contient; il est garanti que la pile de valeurs ne contiendra qu'une seule valeur en fin d'exécution et que la file d'attente des opérateurs sera vide en fin d'exécution.
C'est du code-golf donc le code le plus court en octets l'emporte.
Cas de test
Pour ces cas de test, le doublon est "
, le négatif est -
, l'addition est +
, la multiplication est ×
et l'égalité est =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Règles
- Les échappatoires standard s'appliquent
- Vous pouvez prendre l'interprète officiel anyfix et le jouer au golf si vous le souhaitez. Attendez-vous à perdre horriblement.
L'entrée sera donnée sous forme de chaîne et la sortie sous forme de tableau, un entier unique, en dehors de la représentation sous forme de chaîne de l'un ou l'autre. Vous pouvez supposer que l'entrée ne contiendra que des espaces, des chiffres et les 5 caractères que vous choisissez.
* pas maintenant
0
et 1
?
×+"10 10
dans les cas de test, ou tout autre exemple, 1) l'utilisation d'un espace blanc et 2) le retard de l'utilisation de l' opérateur en double (deux choses que j'ai complètement manquées).