generated from public/aoc_template
72 lines
1.7 KiB
Python
72 lines
1.7 KiB
Python
from black.trans import defaultdict
|
|
from tools.aoc import AOCDay
|
|
from typing import Any
|
|
|
|
|
|
class Day(AOCDay):
|
|
inputs = [
|
|
[
|
|
(7, "input23_test"),
|
|
(1411, "input23"),
|
|
],
|
|
[
|
|
("co,de,ka,ta", "input23_test"),
|
|
("aq,bn,ch,dt,gu,ow,pk,qy,tv,us,yx,zg,zu", "input23"),
|
|
],
|
|
]
|
|
|
|
def parse_input(self) -> dict[str, set]:
|
|
conns = defaultdict(set)
|
|
for line in self.getInput():
|
|
a, b = line.split("-")
|
|
conns[a].add(b)
|
|
conns[b].add(a)
|
|
|
|
return conns
|
|
|
|
def part1(self) -> Any:
|
|
conns = self.parse_input()
|
|
|
|
sets = set()
|
|
for comp in conns:
|
|
if not comp.startswith("t"):
|
|
continue
|
|
for a in conns[comp]:
|
|
for b in conns[comp]:
|
|
if a == b:
|
|
continue
|
|
if b in conns[a]:
|
|
sets.add(",".join(sorted([comp, a, b])))
|
|
|
|
return len(sets)
|
|
|
|
def part2(self) -> Any:
|
|
conns = self.parse_input()
|
|
|
|
best = set()
|
|
for comp in conns:
|
|
lan = {comp}
|
|
for a in conns[comp]:
|
|
for b in conns[comp]:
|
|
if a == b:
|
|
continue
|
|
if b in conns[a]:
|
|
lan.add(a)
|
|
lan.add(b)
|
|
|
|
good = True
|
|
for a in lan:
|
|
for b in lan:
|
|
if a != b and a not in conns[b]:
|
|
good = False
|
|
|
|
if good and len(lan) > len(best):
|
|
best = lan
|
|
|
|
return ",".join(sorted(best))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
day = Day(2024, 23)
|
|
day.run(verbose=True)
|