Preâmbulo
Os números inteiros são sempre pares ou ímpares . Mesmo números inteiros são divisíveis por dois, números inteiros ímpares não são.
Quando você adiciona dois números inteiros, é possível inferir se o resultado será par ou ímpar, com base no fato de os somas serem pares ou ímpares:
- Par + Par = Par
- Par + Ímpar = Ímpar
- Ímpar + Par = Ímpar
- Ímpar + Ímpar = Par
Da mesma forma, quando você multiplica dois números inteiros, pode inferir se o resultado será par ou ímpar, com base nos fatores pares ou ímpares:
- Par * Par = Par
- Par * Ímpar = Par
- Ímpar * Par = Par
- Ímpar * Ímpar = Ímpar
Portanto, se você conhece a uniformidade ou a estranheza de todas as variáveis em uma expressão matemática que envolve apenas adição e multiplicação, é possível inferir se o resultado será par ou ímpar.
Por exemplo, podemos dizer com segurança que (68 + 99) * 37
resulta em um ímpar, porque um par mais um ímpar ( 68 + 99
) é um ímpar, e que ímpares vezes que outro ímpar ( odd * 37
) dá um ímpar.
Desafio
Escreva um programa ou função que utilize uma sequência contendo apenas os quatro caracteres eo+*
. Essa string representa uma expressão matemática dada na notação de prefixo envolvendo apenas adição ( +
) e multiplicação ( *
). Cada um e
representa um número par arbitrário e cada um o
representa um número ímpar arbitrário.
Sua tarefa é simplificar a expressão, imprimir ou retornar uma única e
ou com o
base em se o resultado da expressão é par ou ímpar.
Você pode assumir que a entrada sempre estará em notação de prefixo válida. Especificamente, cada um +
e *
sempre terá dois operandos correspondentes ocorrendo após ele. Esses operandos podem ser um único e
ou o
, ou outro +
ou *
expressão que, por sua vez, possui operandos.
Por exemplo, a entrada *+eoo
pode ser lida como mul(add(e, o), o)
ou (e + o) * o
em notação de infixo normal . O e
e o primeiro o
são os operandos correspondentes ao +
, +eo
e o último o
são os operandos correspondentes ao *
.
Apenas para esclarecer, aqui estão algumas entradas inválidas que possuem notação de prefixo incorreta:
eo
ooe
o+e
ee*
+*oe
+e*o
Uma única nova linha à direita na saída é boa, mas, caso contrário, uma planície e
para pares ou o
ímpares é tudo o que deve ser produzido.
O código mais curto em bytes vence.
Casos de teste
(Linhas vazias servem apenas para ajudar a separar visualmente casos semelhantes.)
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?