#!/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)