aoc

Advent of Code
git clone https://git.pngu.org/aoc
Log | Files | Refs | README

8_2025.py (958B)


from collections import defaultdict

input = open("data/8_2025.txt")
data = input.read().splitlines()
p, d = [], []

for i in data:
    x, y, z = [int(x) for x in i.split(",")]
    p.append((x, y, z))

for i, (x1, y1, z1) in enumerate(p):
    for j, (x2, y2, z2) in enumerate(p):
        dist = (x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2
        if i > j:
            d.append((dist, i, j))

d = sorted(d)
uf = {i: i for i in range(len(p))}


def find(x):
    if x == uf[x]:
        return x
    uf[x] = find(uf[x])
    return uf[x]


def mix(x, y):
    uf[find(x)] = find(y)


connections = 0

for t, (x, y, z) in enumerate(d):
    if t == 1000:
        sz = defaultdict(int)
        for i in range(len(p)):
            sz[find(i)] += 1
        s = sorted(sz.values())
        print(s[-1] * s[-2] * s[-3])
    if find(y) != find(z):
        connections += 1
        if connections == len(p) - 1:
            print(p[y][0] * p[z][0])
        mix(y, z)