diff options
| author | nekineki <nekineki@nekineki.net> | 2022-12-21 06:42:02 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2022-12-21 06:42:53 +0100 |
| commit | 2618270a477debfabe463be1e5afe60306d2e53f (patch) | |
| tree | aa48469fe4d1218ae13f4e28e831f3263b16560b /2022/day21.py | |
| parent | 7c1e124ce26f4a452827e9f2ecaf5a3271aa649b (diff) | |
day21
Diffstat (limited to '2022/day21.py')
| -rwxr-xr-x | 2022/day21.py | 87 |
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) + |
