72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
''' ****** Задание 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]) |