''' ****** Задание 20 из 20 ********* * Напоследок последняя задача с ОПН. Операции, которые выполняются с одним значением, называются унарными, с двумя — бинарными, с тремя — тернарными. Давайте улучшим наш калькулятор, добавив поддержку следующих операций: бинарные: + (сложение), - (вычитание), * (умножение), / (деление нацело; для отрицательных чисел работает по тем же правилам, что и в Python); унарные: ~ (унарный минус — меняет знак), ! (факториал), # (клонирование — вернуть в стек значение дважды); тернарные: @ (возвращает в стек те же три значения, но в ином порядке: второе, третье, первое). Формат ввода Вводится одна строка, содержащая разделённые пробелами целые числа и знаки операций. Вместе они составляют корректное выражение в обратной польской нотации, не содержащее деления на ноль и взятия факториала от отрицательного числа. Формат вывода Выводится одно целое число — результат вычисления выражения. Подсказка В первом примере стек по мере прочтения строки выглядит так: 7 7 1 7 1 10 7 1 10 100 7 1 10 100 100 7 1 10 10000 7 10 10000 1 7 10 9999 7 10009 10016 -10016 Пример 1 Ввод 7 1 10 100 # * @ - + + ~ Вывод -10016 ''' if __name__ == "__main__": def factorial(n): return n * factorial(n - 1) if n > 1 else 1 data = list(input().split()) result = [int(data[0])] for i in data[1:]: if i.isdigit(): result.append(int(i)) elif i == "/": a = result.pop() result[-1] //= a elif i == "~": result[-1] = -result[-1] elif i == "#": result.append(result[-1]) elif i == "!": result[-1] = factorial(result[-1]) elif i == "@": result.append(result.pop(-3)) else: a = result.pop() exec("result[-1] " + i + "= a") print(result[0])