/
aoc_18a.py
57 lines (49 loc) · 1.32 KB
/
aoc_18a.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
fin = open("input_18.txt")
digits = '1234567890'
def prep(text):
text = text.strip().replace(' ','')
text = text[::-1]
text = text.replace('(','X')
text = text.replace(')','(')
text = text.replace('X',')')
return text
def geval(text):
# print(text)
if text[0] == '(':
plevel = 1
for i,char in enumerate(text[1:],1):
if char == '(':
plevel += 1
elif char == ')':
plevel += -1
if plevel == 0:
leftop = text[1:i]
parsepos=i
break
# print('parsepos',parsepos,len(text),leftop)
if parsepos == len(text)-1:
return int(geval(leftop))
else:
op=text[parsepos+1]
rightop=text[parsepos+2:]
elif text[0] in digits:
if len(text) == 1:
return int(text)
else:
leftop = text[0]
op = text[1]
rightop = text[2:]
# print(leftop,':',op,':',rightop)
if op=='+':
return int(geval(leftop))+int(geval(rightop))
elif op=='*':
return int(geval(leftop))*int(geval(rightop))
total = 0
for line in fin:
print(line,end='')
pline = prep(line)
result = int(geval(pline))
total += result
print(pline,'=',result,'\n')
fin.close()
print(total)