Preambuła
Liczby całkowite są zawsze parzyste lub nieparzyste . Nawet liczby całkowite są podzielne przez dwa, nieparzyste liczby całkowite nie są.
Po dodaniu dwóch liczb całkowitych możesz wywnioskować, czy wynik będzie parzysty czy nieparzysty na podstawie tego, czy sumy były parzyste czy nieparzyste:
- Parzysty + Parzysty = Parzysty
- Parzysty + Nieparzysty = Nieparzysty
- Nieparzysty + Parzysty = Nieparzysty
- Nieparzysty + Nieparzysty = Parzysty
Podobnie, mnożąc dwie liczby całkowite, możesz wywnioskować, czy wynik będzie parzysty czy nieparzysty na podstawie tego, czy czynniki były parzyste czy nieparzyste:
- Parzysty * Parzysty = Parzysty
- Parzysty * Nieparzysty = Parzysty
- Nieparzysty * Parzysty = Parzysty
- Nieparzysty * Nieparzysty = Nieparzysty
Zatem jeśli znasz równość lub nieparzystość wszystkich zmiennych w wyrażeniu matematycznym, które obejmuje tylko dodawanie i mnożenie, możesz wywnioskować, czy wynik będzie parzysty czy nieparzysty.
Na przykład możemy śmiało powiedzieć, że (68 + 99) * 37wynikiem jest nieparzysty, ponieważ parzysty plus nieparzysty ( 68 + 99) jest nieparzysty, a ten razy nieparzysty inny nieparzysty ( odd * 37) daje nieparzysty.
Wyzwanie
Napisz program lub funkcję, która pobiera ciąg zawierający tylko cztery znaki eo+*. Ten ciąg reprezentuje wyrażenie matematyczne podane w notacji przedrostkowej obejmującej tylko dodawanie ( +) i mnożenie ( *). Każda ereprezentuje dowolną liczbę parzystą, a każda oreprezentuje dowolną liczbę nieparzystą.
Twoim zadaniem jest uproszczenie wyrażenia, drukowanie lub powrotu pojedynczy elub ona podstawie tego, czy wynikiem wyrażenia jest parzyste, czy nieparzyste.
Możesz założyć, że dane wejściowe zawsze będą miały poprawną notację przedrostkową. W szczególności, każdy +i *zawsze będzie miał dwa odpowiadające operandy występujące po nim. Te argumenty mogą być pojedyncze elub olub inny +albo *wyrażenie, które z kolei ma argumentów.
Na przykład dane wejściowe *+eoomożna odczytać jako mul(add(e, o), o)lub (e + o) * ow normalnej notacji infiksowej . Pierwszy ei pierwszy oto operandy odpowiadające +, a +eoostatni oto operandy odpowiadające *.
Aby to wyjaśnić, oto niektóre niepoprawne dane wejściowe, które mają niepoprawny zapis prefiksu:
eo
ooe
o+e
ee*
+*oe
+e*o
Pojedynczy znak nowej linii na wyjściu jest w porządku, ale poza tym wszystko, co powinno być wyprowadzone , to zwykły eparzysty lub onieparzysty.
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
(Puste wiersze służą jedynie do wizualnego oddzielenia podobnych przypadków.)
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?