summaryrefslogtreecommitdiff
path: root/2025/day08.py
blob: 4baa036aed7056c475c42cd49cf8812a14ffd034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python3
from functools import reduce
from re import findall
from copy import deepcopy
import sys
import numpy as np
from collections import defaultdict
from operator import mul

filename = sys.argv[1] if len(sys.argv) == 2 \
    else "in/" + sys.argv[0].split('/')[-1].rstrip(".py") + ".pzl"
data = open(filename).read()
lines = data.rstrip('\n').split('\n')

counter = 0
points = []
for line in lines:
    a = line.split(',')
    x,y,z = [int(i) for i in a]
    points.append((counter, x, y, z))
    counter += 1

def dist(p0, p1):
    _, x0, y0, z0 = p0
    _, x1, y1, z1 = p1
    return np.sqrt((x1 - x0)**2 + (y1 - y0)**2 + (z1 - z0)**2)


D = []
for i, p0 in enumerate(points):
    for p1 in points[i+1:]:
        d = dist(p0, p1)
        D.append((d, p0, p1))
D.sort()

groups = [i for i in range(len(points))]

res1 = 0
res2 = 0
count = 0
for d, p0, p1 in D:
    g0 = groups[p0[0]]
    g1 = groups[p1[0]]
    m = min(g0, g1)
    for i in range(len(groups)):
        if groups[i] == g0 or groups[i] == g1:
            groups[i] = m

    hist = defaultdict(int)
    for i in groups:
        hist[i] += 1

    count += 1
    if count == 1000:
        res1 = reduce(mul, sorted(hist.values(), reverse=True)[:3])
    if len(hist) == 1:
        res2 = p0[1] * p1[1]

    if res1 != 0 and res2 != 0:
        break

print('res1:', res1)
print('res2:', res2)