import math

def RPN_calc(list_calc_exp):

    operators = {'+': lambda b,a: a+b,
                 '-': lambda b,a: a-b,
                 '*': lambda b,a: a*b,
                 '/': lambda b,a: a/b,
                 '//': lambda b,a: a//b,
                 '%': lambda b,a: a%b,
                 '^': lambda b,a: a**b,
                 '!': lambda x: math.factorial(x)}


    for ind, char in enumerate(list_calc_exp):
        if char == '!':
            list_calc_exp[ind-1] = operators[char](float(list_calc_exp[ind-1]))
            del list_calc_exp[ind]
            return list_calc_exp
        elif char in operators:
            list_calc_exp[ind-2] = operators[char](float(list_calc_exp[ind-1]), float(list_calc_exp[ind-2]))
            del list_calc_exp[ind]
            del list_calc_exp[ind-1]
            return list_calc_exp

def output_res(text):

    result = text.split()

    while len(result) != 1:
        result = RPN_calc(result)
    return result[0]


print(output_res('0.5 1 2 ! * 2 1 ^ + 10 + *'))
print(output_res('1 2 3 4 ! + - / 100 *'))
print(output_res('100 807 3 331 * + 2 2 1 + 2 + * 5 ^ * 23 10 558 * 10 * + + *'))