import math
ops = {
'+': float.__add__,
'-': float.__sub__,
'*': float.__mul__,
'x': float.__mul__,
'/': float.__truediv__,
'//': float.__floordiv__,
'%': float.__mod__,
'^': pow,
'!': math.factorial
}
unary_ops = ('!',)
arg_count = {ops[op]: 1 if op in unary_ops else 2 for op in ops}
def evaluate(expr):
stack = []
for token in expr.split():
if token in ops:
op = ops[token]
args = reversed([stack.pop() for _ in range(arg_count[op])])
stack.append(float(op(*args)))
else:
stack.append(float(token))
result = stack[0]
return int(result) if result.is_integer else result
print(evaluate('0.5 1 2 ! * 2 1 ^ + 10 + *'))
print(evaluate('1 2 3 4 ! + - / 100 *'))
print(evaluate('100 807 3 331 * + 2 2 1 + 2 + * 5 ^ * 23 10 558 * 10 * + + *'))
aW1wb3J0IG1hdGgKb3BzID0gewogICAgJysnOiBmbG9hdC5fX2FkZF9fLAogICAgJy0nOiBmbG9hdC5fX3N1Yl9fLAogICAgJyonOiBmbG9hdC5fX211bF9fLAogICAgJ3gnOiBmbG9hdC5fX211bF9fLAogICAgJy8nOiBmbG9hdC5fX3RydWVkaXZfXywKICAgICcvLyc6IGZsb2F0Ll9fZmxvb3JkaXZfXywKICAgICclJzogZmxvYXQuX19tb2RfXywKICAgICdeJzogcG93LAogICAgJyEnOiBtYXRoLmZhY3RvcmlhbAogICAgfQp1bmFyeV9vcHMgPSAoJyEnLCkKYXJnX2NvdW50ID0ge29wc1tvcF06IDEgaWYgb3AgaW4gdW5hcnlfb3BzIGVsc2UgMiBmb3Igb3AgaW4gb3BzfQoKZGVmIGV2YWx1YXRlKGV4cHIpOgogICAgc3RhY2sgPSBbXQogICAgZm9yIHRva2VuIGluIGV4cHIuc3BsaXQoKToKICAgICAgICBpZiB0b2tlbiBpbiBvcHM6CiAgICAgICAgICAgIG9wID0gb3BzW3Rva2VuXQogICAgICAgICAgICBhcmdzID0gcmV2ZXJzZWQoW3N0YWNrLnBvcCgpIGZvciBfIGluIHJhbmdlKGFyZ19jb3VudFtvcF0pXSkKICAgICAgICAgICAgc3RhY2suYXBwZW5kKGZsb2F0KG9wKCphcmdzKSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhY2suYXBwZW5kKGZsb2F0KHRva2VuKSkKICAgIHJlc3VsdCA9IHN0YWNrWzBdCiAgICByZXR1cm4gaW50KHJlc3VsdCkgaWYgcmVzdWx0LmlzX2ludGVnZXIgZWxzZSByZXN1bHQKCnByaW50KGV2YWx1YXRlKCcwLjUgMSAyICEgKiAyIDEgXiArIDEwICsgKicpKQpwcmludChldmFsdWF0ZSgnMSAyIDMgNCAhICsgLSAvIDEwMCAqJykpCnByaW50KGV2YWx1YXRlKCcxMDAgODA3IDMgMzMxICogKyAyIDIgMSArIDIgKyAqIDUgXiAqIDIzIDEwIDU1OCAqIDEwICogKyArIConKSk=