Сделал 20 задание

This commit is contained in:
parent 8e49e267ba
commit a06c679a8a

72
lesson.20.py Normal file
View file

@ -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])