Preámbulo
Los enteros siempre son pares o impares . Los enteros pares son divisibles por dos, los enteros impares no.
Cuando agrega dos enteros, puede inferir si el resultado será par o impar en función de si los sumandos fueron pares o impares:
- Par + Par = Par
- Par + impar = impar
- Impar + par = impar
- Impar + impar = par
Del mismo modo, cuando multiplica dos enteros, puede inferir si el resultado será par o impar en función de si los factores fueron pares o impares:
- Par * Par = Par
- Par * impar = par
- Impar * par = par
- Odd * Odd = Odd
Por lo tanto, si conoce la uniformidad o impar de todas las variables en una expresión matemática que solo involucra la suma y la multiplicación, puede inferir si el resultado será par o impar.
Por ejemplo, podemos decir con confianza que (68 + 99) * 37
da como resultado un impar porque un par más un impar ( 68 + 99
) es un impar, y ese impar multiplicado por otro impar ( odd * 37
) da un impar.
Desafío
Escriba un programa o función que tome una cadena que solo contenga los cuatro caracteres eo+*
. Esta cadena representa una expresión matemática dada en notación de prefijo que involucra solo la suma ( +
) y la multiplicación ( *
). Cada uno e
representa un número par arbitrario, y cada uno o
representa un número impar arbitrario.
Su tarea es simplificar la expresión, imprimir o devolver una sola e
o en o
función de si el resultado de la expresión es par o impar.
Puede suponer que la entrada siempre estará en notación de prefijo válida. Específicamente, cada uno +
y *
siempre tendrá dos operandos correspondientes que ocurren después de él. Estos operandos pueden ser un solo e
o o
, u otro +
o *
expresión que a su vez tiene operandos.
Por ejemplo, la entrada *+eoo
podría leerse como mul(add(e, o), o)
, o (e + o) * o
en notación infija normal . El e
y el primero o
son los operandos correspondientes al +
, +eo
y el último o
son los operandos correspondientes al *
.
Solo para que quede claro, aquí hay algunas entradas inválidas que tienen una notación de prefijo incorrecta:
eo
ooe
o+e
ee*
+*oe
+e*o
Una nueva línea final en la salida está bien, pero de lo contrario, todo lo que debe salir es una llanura e
par o o
impar.
El código más corto en bytes gana.
Casos de prueba
(Las líneas vacías son solo para ayudar a separar visualmente casos similares).
e -> e
o -> o
+ee -> e
+eo -> o
+oe -> o
+oo -> e
*ee -> e
*eo -> e
*oe -> e
*oo -> o
+e+ee -> e
+e+eo -> o
+e+oe -> o
+e+oo -> e
+e*ee -> e
+e*eo -> e
+e*oe -> e
+e*oo -> o
+o+ee -> o
+o+eo -> e
+o+oe -> e
+o+oo -> o
+o*ee -> o
+o*eo -> o
+o*oe -> o
+o*oo -> e
*e+ee -> e
*e+eo -> e
*e+oe -> e
*e+oo -> e
*e*ee -> e
*e*eo -> e
*e*oe -> e
*e*oo -> e
*o+ee -> e
*o+eo -> o
*o+oe -> o
*o+oo -> e
*o*ee -> e
*o*eo -> e
*o*oe -> e
*o*oo -> o
++eee -> e
++eeo -> o
++eoe -> o
++eoo -> e
++oee -> o
++oeo -> e
++ooe -> e
++ooo -> o
+*eee -> e
+*eeo -> o
+*eoe -> e
+*eoo -> o
+*oee -> e
+*oeo -> o
+*ooe -> o
+*ooo -> e
*+eee -> e
*+eeo -> e
*+eoe -> e
*+eoo -> o
*+oee -> e
*+oeo -> o
*+ooe -> e
*+ooo -> e
**eee -> e
**eeo -> e
**eoe -> e
**eoo -> e
**oee -> e
**oeo -> e
**ooe -> e
**ooo -> o
+e+e+e+ee -> e
+o+o+o+oo -> o
*e*e*e*ee -> e
*o*o*o*oo -> o
+e+o+e+oe -> e
+o+e+o+eo -> o
*e*o*e*oe -> e
*o*e*o*eo -> e
+e*e+e*ee -> e
+o*o+o*oo -> o
*e+e*e+ee -> e
*o+o*o+oo -> o
+**++*+*eeoeeooee -> e
+**++*+***eooeoeooeoe -> e
+**+***+**++**+eooeoeeoeeoeooeo -> o
+e*o*e**eoe -> e
+*e+e+o+e**eeoe -> e
**o++*ee*++eoe*eo+eoo -> o
eval
OK?