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)