Fixup day18 and add second part
[advent-of-code-2020.git] / day18 / badmath2.py
diff --git a/day18/badmath2.py b/day18/badmath2.py
new file mode 100755 (executable)
index 0000000..4100f45
--- /dev/null
@@ -0,0 +1,87 @@
+#!/usr/bin/python3
+
+import sys
+
+filename="p1_71.txt"
+if len(sys.argv) > 1:
+    filename=sys.argv[1]
+
+def parse_sum(oursum):
+    parts = oursum.split()
+    new_parts=[]
+
+    for part in parts:
+        if part[0]=="(":
+            for index,c in enumerate(part):
+                if c=="(":
+                    new_parts.append("(")
+                else:
+                    new_parts.extend(parse_sum(part[index:]))
+                    break
+        elif part[-1]==")":
+            got_number=False
+            for index,c in enumerate(part):
+                if c==")":
+                    if not got_number:
+                        new_parts.extend(parse_sum(part[0:index]))
+                        got_number=True
+                    new_parts.append(c)
+        elif part in ['+','*']:
+            new_parts.append(part)
+        else:
+            new_parts.append(int(part))
+    return new_parts
+
+def do_sum(parts):
+    cur_total=0
+    next_oper="+"
+    bracketed=[]
+    in_brackets=0
+    new_parts=[]
+
+    # first do all bracketed parts
+    for part in parts:
+        if in_brackets > 0 and part != ")" and part != "(":
+            bracketed.append(part)
+            continue
+        if in_brackets > 0 and part == ")":
+            in_brackets-=1
+            bracketed.append(part)
+            if in_brackets == 0:
+                part=do_sum(bracketed[1:-1])
+                bracketed.clear()
+            else:
+                continue
+        if part == "(":
+            in_brackets+=1
+            bracketed.append(part)
+            continue
+        new_parts.append(part)
+
+    while "+" in new_parts:
+        plus_index = new_parts.index("+")
+        left=new_parts[plus_index-1]
+        right=new_parts[plus_index+1]
+        new_new_parts=new_parts[:plus_index-1]
+        new_new_parts.append(left+right)
+        new_new_parts.extend(new_parts[plus_index+2:])
+        new_parts=new_new_parts
+
+    cur_total=new_parts[0]
+
+    # now we should just be able to go through new_parts left to right
+    for part in new_parts[1:]:
+        if part == '*':
+            continue
+        else:
+            cur_total*=int(part)
+
+    return cur_total
+
+total=0
+total2=0
+for line in [line.rstrip() for line in open(filename, "r")]:
+    answer=do_sum(parse_sum(line))
+    total+=answer
+
+print("Part 2 Total:", total)