diff --git a/lesson.20.py b/lesson.20.py new file mode 100644 index 0000000..f454fff --- /dev/null +++ b/lesson.20.py @@ -0,0 +1,72 @@ +''' ****** Задание 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]) \ No newline at end of file