from math import prod, sqrt from pathlib import Path from typing import TypeAlias Point: TypeAlias = tuple[int, int, int] Circuit: TypeAlias = set[Point] FILE = "input.txt" def main(): lines = Path(FILE).read_text().splitlines() points: list[Point] = [parse_point(line) for line in lines] distances = sorted([ (distance(p1, p2), Circuit([p1, p2])) for i, p1 in enumerate(points) for p2 in points[i+1:] ], key=lambda x: x[0]) all: list[Circuit] = [] for (_, circuit) in distances[:1000]: connected = [ a for a in all if circuit & a ] all = [a for a in all if a not in connected] all.append(Circuit.union(circuit, *connected)) all = sorted( all, key=lambda x: len(x), reverse=True ) return prod(len(c) for c in all[:3]) def distance(p1: tuple[int, int, int], p2: tuple[int, int, int]): x1, y1, z1 = p1 x2, y2, z2 = p2 return sqrt((x2-x1)**2+(y2-y1)**2+(z2-z1)**2) def parse_point(line: str) -> Point: x, y, z = line.split(",") return (int(x), int(y), int(z)) if __name__ == "__main__": print(main())