-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday21.py
68 lines (46 loc) · 1.28 KB
/
day21.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from aoc import *
from operator import add, mul, sub, floordiv
operators = {
"+": add,
"-": sub,
"*": mul,
"/": floordiv
}
def parse_input(data):
monkeys = dict()
for line in data:
m, *ops = line.split()
m = m[:-1]
if len(ops) == 1:
monkeys[m] = int(ops[0])
else:
monkeys[m] = (operators[ops[1]], ops[0], ops[2])
return monkeys
def dfs(monkeys, m='root'):
if type(monkeys[m]) is int:
return monkeys[m]
else:
op, l, r = monkeys[m]
return op(dfs(monkeys, l), dfs(monkeys, r))
def human_yell(monkeys):
_, l, r = monkeys['root']
monkeys['root'] = (sub, l, r)
root_value = dfs(monkeys)
initial_sign = sign(root_value)
space = (0, 99999999999999)
while root_value:
mid = sum(space) // 2
monkeys['humn'] = mid
root_value = dfs(monkeys)
if sign(root_value) == initial_sign:
space = (mid+1, space[1])
else:
space = (space[0], mid)
return monkeys['humn']
def solve(filename=21):
monkeys = parse_input(read_input(filename))
return dfs(monkeys), human_yell(monkeys)
print(solve())
def test():
assert solve("21_test") == (152, 301)
assert solve() == (63119856257960, 3006709232464)