aoc2017/day12.py
Stefan Harmuth 648212f24d day12
2022-11-29 21:57:17 +01:00

67 lines
1.6 KiB
Python

from tools.aoc import AOCDay
from typing import Any
class Programm:
def __init__(self, pid: int):
self.pid = pid
self.children = set()
class Day(AOCDay):
inputs = [
[
(6, "input12_test"),
(145, "input12")
],
[
(207, "input12")
]
]
def build_programm_tree(self) -> dict:
ret = {}
for line in self.getInput():
pid, peer_str = line.split(" <-> ")
pid = int(pid)
if pid not in ret:
ret[pid] = Programm(pid)
peers = list(map(int, peer_str.split(", ")))
for x in peers:
if x not in ret:
ret[x] = Programm(x)
ret[pid].children.add(ret[x])
ret[x].children.add(ret[pid])
return ret
def count_group_zero(self, programs: dict, start: int = 0, counted: set = None) -> (int, set):
count = 0
if counted is None:
counted = set()
counted.add(start)
for p in programs[start].children:
if p.pid not in counted:
count += self.count_group_zero(programs, p.pid, counted)[0]
return count + 1, counted
def part1(self) -> Any:
return self.count_group_zero(self.build_programm_tree(), 0)[0]
def part2(self) -> Any:
p = self.build_programm_tree()
g = 0
c = set()
for x in p:
if x in c:
continue
c = c.union(self.count_group_zero(p, x)[1])
g += 1
return g
if __name__ == '__main__':
day = Day(2017, 12)
day.run(verbose=True)