Fixup day18 and add second part
[advent-of-code-2020.git] / day18 / badmath2.py
1 #!/usr/bin/python3
2
3 import sys
4
5 filename="p1_71.txt"
6 if len(sys.argv) > 1:
7     filename=sys.argv[1]
8
9 def parse_sum(oursum):
10     parts = oursum.split()
11     new_parts=[]
12
13     for part in parts:
14         if part[0]=="(":
15             for index,c in enumerate(part):
16                 if c=="(":
17                     new_parts.append("(")
18                 else:
19                     new_parts.extend(parse_sum(part[index:]))
20                     break
21         elif part[-1]==")":
22             got_number=False
23             for index,c in enumerate(part):
24                 if c==")":
25                     if not got_number:
26                         new_parts.extend(parse_sum(part[0:index]))
27                         got_number=True
28                     new_parts.append(c)
29         elif part in ['+','*']:
30             new_parts.append(part)
31         else:
32             new_parts.append(int(part))
33     return new_parts
34
35 def do_sum(parts):
36     cur_total=0
37     next_oper="+"
38     bracketed=[]
39     in_brackets=0
40     new_parts=[]
41
42     # first do all bracketed parts
43     for part in parts:
44         if in_brackets > 0 and part != ")" and part != "(":
45             bracketed.append(part)
46             continue
47         if in_brackets > 0 and part == ")":
48             in_brackets-=1
49             bracketed.append(part)
50             if in_brackets == 0:
51                 part=do_sum(bracketed[1:-1])
52                 bracketed.clear()
53             else:
54                 continue
55         if part == "(":
56             in_brackets+=1
57             bracketed.append(part)
58             continue
59         new_parts.append(part)
60
61     while "+" in new_parts:
62         plus_index = new_parts.index("+")
63         left=new_parts[plus_index-1]
64         right=new_parts[plus_index+1]
65         new_new_parts=new_parts[:plus_index-1]
66         new_new_parts.append(left+right)
67         new_new_parts.extend(new_parts[plus_index+2:])
68         new_parts=new_new_parts
69
70     cur_total=new_parts[0]
71
72     # now we should just be able to go through new_parts left to right
73     for part in new_parts[1:]:
74         if part == '*':
75             continue
76         else:
77             cur_total*=int(part)
78
79     return cur_total
80
81 total=0
82 total2=0
83 for line in [line.rstrip() for line in open(filename, "r")]:
84     answer=do_sum(parse_sum(line))
85     total+=answer
86
87 print("Part 2 Total:", total)