summaryrefslogtreecommitdiff
path: root/2022/day21.py
diff options
context:
space:
mode:
Diffstat (limited to '2022/day21.py')
-rwxr-xr-x2022/day21.py87
1 files changed, 87 insertions, 0 deletions
diff --git a/2022/day21.py b/2022/day21.py
new file mode 100755
index 0000000..a730104
--- /dev/null
+++ b/2022/day21.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python3
+
+# import numpy as np
+from functools import reduce
+from re import findall
+from copy import deepcopy
+import sys
+
+# filename = "in/day21.ref"
+filename = "in/day21.pzl"
+data = open(filename).read()
+lines = [line for line in data.rstrip('\n').split('\n')]
+
+M = dict()
+for line in lines:
+ s = line.split(' ')
+ if len(s) == 2:
+ M[s[0].strip(':')] = int(s[1])
+ elif len(s) == 4:
+ M[s[0].strip(':')] = (s[1], s[3], s[2])
+ else:
+ print('error parsing')
+# print(M)
+# print(M['root'])
+
+
+# part1
+def op1(node):
+ if type(M[node]) == int:
+ return M[node]
+ else:
+ n1 = op1(M[node][0])
+ n2 = op1(M[node][1])
+ if M[node][2] == '+':
+ return n1 + n2
+ elif M[node][2] == '-':
+ return n1 - n2
+ elif M[node][2] == '*':
+ return n1 * n2
+ elif M[node][2] == '/':
+ # int divide
+ return n1 // n2
+
+res1 = op1('root')
+
+
+# part2
+def op2(node, guess):
+ if node == 'root':
+ n1 = op2(M[node][0], guess)
+ n2 = op2(M[node][1], guess)
+ return n1, n2
+ elif node == 'humn':
+ return guess
+ elif type(M[node]) == int:
+ return M[node]
+ else:
+ n1 = op2(M[node][0], guess)
+ n2 = op2(M[node][1], guess)
+ if M[node][2] == '+':
+ return n1 + n2
+ elif M[node][2] == '-':
+ return n1 - n2
+ elif M[node][2] == '*':
+ return n1 * n2
+ elif M[node][2] == '/':
+ # float divide
+ return n1 / n2
+
+def bisect(start, stop):
+ for _ in range(200):
+ guess = (start + stop) // 2
+ n1, n2 = op2('root', guess)
+ # print(guess, n1, n2)
+ if n1 == n2:
+ return guess
+ elif n1 > n2:
+ start = guess
+ else:
+ stop = guess
+
+res2 = bisect(0, 50000000000000)
+
+
+print('res1:', res1)
+print('res2:', res2)
+