d7
This commit is contained in:
parent
0ea4056bb2
commit
39bf998b51
82
day07.py
Normal file
82
day07.py
Normal file
@ -0,0 +1,82 @@
|
||||
from tools.aoc import AOCDay
|
||||
from typing import Any
|
||||
|
||||
|
||||
class Program:
|
||||
def __init__(self, name: str, weight: int):
|
||||
self.name = name
|
||||
self.weight = weight
|
||||
self.children = set()
|
||||
|
||||
def add(self, other: 'Program'):
|
||||
if other not in self.children:
|
||||
self.children.add(other)
|
||||
|
||||
def get_weight_total(self):
|
||||
return self.weight + sum([x.get_weight_total() for x in self.children])
|
||||
|
||||
|
||||
def get_weight(root: Program, diff: int = 0) -> int:
|
||||
weights = {}
|
||||
for child in root.children:
|
||||
child_weight_total = child.get_weight_total()
|
||||
if child_weight_total not in weights:
|
||||
weights[child_weight_total] = []
|
||||
weights[child_weight_total].append(child)
|
||||
|
||||
present_weights = list(weights.keys())
|
||||
if len(present_weights) == 1:
|
||||
return root.weight + diff
|
||||
else:
|
||||
if len(weights[present_weights[0]]) == 1: # 0 is the problem
|
||||
return get_weight(weights[present_weights[0]][0], present_weights[1] - present_weights[0])
|
||||
else: # 1 is the problem
|
||||
return get_weight(weights[present_weights[1]][0], present_weights[0] - present_weights[1])
|
||||
|
||||
|
||||
class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
("tknk", "input7_test"),
|
||||
("aapssr", "input7")
|
||||
],
|
||||
[
|
||||
(60, "input7_test"),
|
||||
(1458, "input7")
|
||||
]
|
||||
]
|
||||
|
||||
def parse_input(self) -> Program:
|
||||
child_cache = {}
|
||||
progs = {}
|
||||
prog_set = set()
|
||||
for line in self.getInput():
|
||||
if "->" not in line:
|
||||
prog_name, weight_string = line.split(" ")
|
||||
else:
|
||||
prog_string, children = line.split(" -> ")
|
||||
prog_name, weight_string = prog_string.split(" ")
|
||||
child_cache[prog_name] = children.split(", ")
|
||||
|
||||
prog_set.add(prog_name)
|
||||
progs[prog_name] = Program(prog_name, int(weight_string[1:-1]))
|
||||
|
||||
for prog, childs in child_cache.items():
|
||||
for child in childs:
|
||||
prog_set.remove(child)
|
||||
progs[prog].add(progs[child])
|
||||
|
||||
return progs[prog_set.pop()]
|
||||
|
||||
def part1(self) -> Any:
|
||||
root = self.parse_input()
|
||||
return root.name
|
||||
|
||||
def part2(self) -> Any:
|
||||
root = self.parse_input()
|
||||
return get_weight(root)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
day = Day(2017, 7)
|
||||
day.run(verbose=True)
|
||||
1059
inputs/input7
Normal file
1059
inputs/input7
Normal file
File diff suppressed because it is too large
Load Diff
13
inputs/input7_test
Normal file
13
inputs/input7_test
Normal file
@ -0,0 +1,13 @@
|
||||
pbga (66)
|
||||
xhth (57)
|
||||
ebii (61)
|
||||
havc (66)
|
||||
ktlj (57)
|
||||
fwft (72) -> ktlj, cntj, xhth
|
||||
qoyq (66)
|
||||
padx (45) -> pbga, havc, qoyq
|
||||
tknk (41) -> ugml, padx, fwft
|
||||
jptl (61)
|
||||
ugml (68) -> gyxo, ebii, jptl
|
||||
gyxo (61)
|
||||
cntj (57)
|
||||
Loading…
Reference in New Issue
Block a user