En la notación de prefijo, el operador viene antes que los argumentos, por lo que puede imaginar que el operador llama a lo next()
que se llama de forma recursiva. En notación infija, el operador va entre los argumentos, por lo que puede imaginarlo simplemente como un árbol de análisis. En la notación postfix, el operador viene después de los argumentos, por lo que puede imaginarlo como basado en la pila.
En cualquier notación, el operador puede ir a cualquier parte * . Si aparece un operador y no hay suficientes argumentos, entonces el operador espera hasta que haya suficientes argumentos. Para este desafío, debe implementar un evaluador anyfix muy básico. (Tenga en cuenta que anyfix es un lenguaje recreativo que abandoné con el que puede jugar aquí o consultar aquí )
Deberá admitir los siguientes comandos:
(Arity 1)
- duplicar
- negativo
(Arity 2)
- adición
- multiplicación
- igualdad: devoluciones
0
o1
.
Puede elegir usar cinco símbolos que no sean espacios en blanco para estos comandos. Con fines demostrativos, usaré "
como duplicado, ×
como multiplicación y +
como suma.
Para literales, solo necesita admitir enteros no negativos, pero su intérprete debe poder contener todos los enteros (dentro del rango de enteros (razonable) de su idioma).
Vamos a echar un vistazo a un ejemplo: 10+5
. El almacenamiento debe comportarse como una pila, no como una cola. Entonces, primero, la pila comienza en []
, y la lista de operadores en cola comienza en []
. Luego, 10
se evalúa el literal que hace la pila [10]
. A continuación, +
se evalúa el operador , que requiere dos argumentos. Sin embargo, solo hay un argumento en la pila, por lo que se convierte en la lista de operadores en cola ['+']
. Luego, 5
se evalúa el literal que hace la pila [10, 5]
. En este punto, el operador '+'
puede ser evaluado para que así sea, haciendo que la pila [15]
y la cola[]
.
El resultado final debe ser [15]
de + 10 5
, 10 + 5
, y 10 5 +
.
Vamos a echar un vistazo a un ejemplo más difícil: 10+"
. La pila y la cola comienzan como []
y []
. 10
se evalúa primero lo que hace la pila [10]
. A continuación, +
se evalúa, lo que no cambia la pila (porque no hay suficientes argumentos) y hace la cola ['+']
. Entonces, "
se evalúa. Esto puede ejecutarse inmediatamente, por lo que es así, haciendo la pila [10, 10]
. +
ahora se puede evaluar para que la pila se convierta [20]
y la cola []
. El resultado final es [20]
.
¿Qué pasa con el orden de las operaciones?
Echemos un vistazo ×+"10 10
. La pila y la cola comienzan como []
:
×
: La pila no cambia y la cola se convierte['×']
.+
: La pila no cambia y la cola se convierte['×', '+']
."
: La pila no cambia y la cola se convierte['×', '+', '"']
.10
: La pila se convierte[10]
. Aunque×
debería ser el primer operador en ser evaluado, ya que aparece primero,"
puede ejecutarse inmediatamente y ninguno de los operadores antes que puede, por lo que se evalúa. La pila se convierte[10, 10]
y la cola['×', '+']
.×
ahora se puede evaluar, lo que hace que la pila[100]
y la cola['+']
.10
: La pila se convierte[100, 10]
, lo que permite+
ser evaluada. La pila se convierte[110]
y la cola[]
.
El resultado final es [110]
.
Los comandos utilizados en estas demostraciones son consistentes con los del lenguaje anyfix; sin embargo, el último ejemplo no funcionará debido a un error en mi intérprete. (Descargo de responsabilidad: sus envíos no se utilizarán en el intérprete anyfix)
Desafío
Seleccione un conjunto de 5 caracteres que no sean espacios en blanco y que no sean dígitos y cree un intérprete anyfix de acuerdo con las especificaciones anteriores. Su programa puede generar la matriz singular o el valor que contiene; se garantiza que la pila de valores solo contendrá un valor único al final de la ejecución y que la cola de operadores estará vacía al final de la ejecución.
Esto es código golf por lo que gana el código más corto en bytes.
Casos de prueba
Para estos casos de prueba, duplicado es "
, negativo es -
, suma es +
, multiplicación es ×
e igualdad es =
.
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)
Reglas
- Se aplican lagunas estándar
- Puede tomar el intérprete oficial anyfix y jugarlo si lo desea. Espera perder horriblemente.
La entrada se dará como una cadena y la salida como una matriz, un solo entero, fuera de la representación de la cadena de cualquiera. Puede suponer que la entrada solo contendrá espacios, dígitos y los 5 caracteres que elija.
* no realmente
0
y 1
?
×+"10 10
en los casos de prueba, o cualquier otro ejemplo que esté 1) usando un espacio en blanco y 2) retrasando el uso del operador duplicado (dos cosas que omití por completo).