48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
d = {'+': '+', '-': '-', '.': '*', ':': '/', '^': '**'}
|
|
|
|
def Steps(string):
|
|
val = int()
|
|
for char in string:
|
|
if char in '+-.:^':
|
|
val += 1
|
|
return val
|
|
|
|
def Calc(string):
|
|
global d
|
|
for char in '+-.:^':
|
|
string = string.replace(char, ' {} '.format(char))
|
|
l = string.split()
|
|
for char in '^.:+-':
|
|
if char in l:
|
|
idx = l.index(char)
|
|
s = ' '.join(l[idx - 1:idx + 2])
|
|
return string.replace(s, str(eval(s.replace(char, d[char]))))
|
|
|
|
def MetaCalc(string):
|
|
for idx0, char0 in enumerate(string):
|
|
if char0 == ')':
|
|
for idx1, char1 in enumerate(reversed(string)):
|
|
if char1 == '(':
|
|
idx1 = len(string) - idx1 - 1
|
|
s = '({})'.format(Calc(string[idx1 + 1:idx0]))
|
|
if not(Steps(s)) or ((Steps(s) == 1) and (s[:2] == '(-')):
|
|
s = s[1:-1]
|
|
return string.replace(string[idx1:idx0 + 1], s)
|
|
return Calc(string)
|
|
|
|
with open('bai2.inp') as f:
|
|
s = f.readline()
|
|
lines = Steps(s)
|
|
for i in d:
|
|
s = s.replace(i, ' ' + i + ' ')
|
|
for i in d:
|
|
s = s.replace(i + ' - ', i + ' -')
|
|
l = s.split()
|
|
with open('bai2.out', 'w') as f:
|
|
f.write(''.join(l) + '\n')
|
|
for _ in range(lines):
|
|
s = MetaCalc(s).replace(' ', '')
|
|
f.write('=' + s)
|
|
print(s)
|