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) * 37
wynikiem 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 e
reprezentuje dowolną liczbę parzystą, a każda o
reprezentuje dowolną liczbę nieparzystą.
Twoim zadaniem jest uproszczenie wyrażenia, drukowanie lub powrotu pojedynczy e
lub o
na 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 e
lub o
lub inny +
albo *
wyrażenie, które z kolei ma argumentów.
Na przykład dane wejściowe *+eoo
można odczytać jako mul(add(e, o), o)
lub (e + o) * o
w normalnej notacji infiksowej . Pierwszy e
i pierwszy o
to operandy odpowiadające +
, a +eo
ostatni o
to 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 e
parzysty lub o
nieparzysty.
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?