From a06c679a8a468df0a1a42eb6af522e2a6d2b86c6 Mon Sep 17 00:00:00 2001 From: Zver Date: Mon, 15 Dec 2025 14:47:03 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=2020=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lesson.20.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lesson.20.py 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