12345678910111213141516171819202122232425262728293031323334353637383940 |
- from types import SimpleNamespace
-
- programs = {}
-
- with open('data/07.txt', 'r') as file:
- for line in file.readlines():
- details = line.strip().split(' -> ')[0]
- children = line.strip().split(' -> ')[1].split(', ') if '->' in line else []
- name, weight = details.split(' ')
- weight = int(weight.strip('()'))
- programs[name] = SimpleNamespace(name=name, weight=weight, total_weight=-1, child_names=children, children=[])
-
- roots = list(programs.keys())
- leaves = []
-
- for program in list(programs.values()):
- for child in program.child_names:
- program.children.append(programs[child])
- programs[child].parent = program
- roots.remove(child)
- if len(program.children) == 0:
- leaves.append(program)
-
-
- def resolve_weight(program):
- if program.total_weight == -1:
- program.total_weight = program.weight + sum(resolve_weight(child) for child in program.children)
- return program.total_weight
-
-
- def check_weight(program):
- weights = [child.total_weight for child in program.children]
- for child in program.children:
- if weights.count(child.total_weight) == 1:
- return check_weight(child) or next(w for w in weights if w != child.total_weight) - sum(c.total_weight for c in child.children)
-
-
- resolve_weight(programs[roots[0]])
- print(f'Part one: {programs[roots[0]].name}')
- print(f'Part two: {check_weight(programs[roots[0]])}')
|