project_python.3.1/lesson.20.py

72 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

''' ****** Задание 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])