This commit is contained in:
Stefan Harmuth 2022-12-21 08:30:49 +01:00
parent 2b3a465c5a
commit 1405847db9
3 changed files with 1967 additions and 0 deletions

117
day21.py Normal file
View File

@ -0,0 +1,117 @@
from tools.aoc import AOCDay
from typing import Any
def has_humn(monkeys: dict, root: str) -> bool:
if root == 'humn':
return True
if monkeys[root]['op'] is None:
return False
opr, _, opl = monkeys[root]['op']
if opr == 'humn' or opl == 'humn':
return True
return has_humn(monkeys, opl) or has_humn(monkeys, opr)
def find_humn(monkeys: dict, root: str, target: int) -> int:
if root == 'humn':
return target
opl, op, opr = monkeys[root]['op']
if has_humn(monkeys, opl):
value = get_monkey(monkeys, opr)
match op:
case '+':
return find_humn(monkeys, opl, target - value)
case '-':
return find_humn(monkeys, opl, target + value)
case '*':
return find_humn(monkeys, opl, target // value)
case '/':
return find_humn(monkeys, opl, target * value)
else:
value = get_monkey(monkeys, opl)
match op:
case '+':
return find_humn(monkeys, opr, target - value)
case '-':
return find_humn(monkeys, opr, value - target)
case '*':
return find_humn(monkeys, opr, target // value)
case '/':
return find_humn(monkeys, opr, target // value)
def get_monkey(monkeys: dict, monkey: str, finalize: bool = False) -> int | None:
if monkeys[monkey]['op'] is None:
return monkeys[monkey]['value']
opl, op, opr = monkeys[monkey]['op']
opl, opr = get_monkey(monkeys, opl, finalize), get_monkey(monkeys, opr, finalize)
if opl is None or opr is None:
return None
match op:
case "+":
monkeys[monkey]['value'] = opl + opr
case "-":
monkeys[monkey]['value'] = opl - opr
case "*":
monkeys[monkey]['value'] = opl * opr
case "/":
monkeys[monkey]['value'] = opl // opr
case _:
print("Unknown op:", op)
if finalize:
monkeys[monkey]['op'] = None
return monkeys[monkey]['value']
class Day(AOCDay):
inputs = [
[
(152, "input21_test"),
(41857219607906, "input21"),
],
[
(301, "input21_test"),
(3916936880448, "input21"),
]
]
def get_monkey_dict(self) -> dict:
monkeys = {}
for line in self.getInput():
a, b = line.split(": ")
try:
monkeys[a] = {
'op': None,
'value': int(b)
}
except ValueError:
monkeys[a] = {
'op': b.split(" "),
'value': None
}
return monkeys
def part1(self) -> Any:
return get_monkey(self.get_monkey_dict(), "root")
def part2(self) -> Any:
monkeys = self.get_monkey_dict()
opl, _, opr = monkeys['root']['op']
if has_humn(monkeys, opl):
return find_humn(monkeys, opl, get_monkey(monkeys, opr))
else:
return find_humn(monkeys, opr, get_monkey(monkeys, opl))
if __name__ == '__main__':
day = Day(2022, 21)
day.run(verbose=True)

1835
inputs/input21 Normal file

File diff suppressed because it is too large Load Diff

15
inputs/input21_test Normal file
View File

@ -0,0 +1,15 @@
root: pppw + sjmn
dbpl: 5
cczh: sllz + lgvd
zczc: 2
ptdq: humn - dvpt
dvpt: 3
lfqf: 4
humn: 5
ljgn: 2
sjmn: drzm * dbpl
sllz: 4
pppw: cczh / lfqf
lgvd: ljgn * ptdq
drzm: hmdt - zczc
hmdt: 32