aboutsummaryrefslogtreecommitdiff
path: root/2025/08/a.py
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-12-08 08:02:19 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2025-12-08 08:02:19 +0100
commitbb6a7fd447db8ebafe9df80097821cb0105907f7 (patch)
treef90268235abbd37eeddc933208dfffec78ec9eaf /2025/08/a.py
parent5d69f923116a2b251a445c0cb9e6f23551ad686a (diff)
downloadaoc-bb6a7fd447db8ebafe9df80097821cb0105907f7.tar.gz
aoc-bb6a7fd447db8ebafe9df80097821cb0105907f7.zip
Refactor
Diffstat (limited to '2025/08/a.py')
-rw-r--r--2025/08/a.py39
1 files changed, 22 insertions, 17 deletions
diff --git a/2025/08/a.py b/2025/08/a.py
index 1980414..b829dca 100644
--- a/2025/08/a.py
+++ b/2025/08/a.py
@@ -2,31 +2,36 @@ import fileinput
2 2
3N = 1000 # Change to 10 for test case 3N = 1000 # Change to 10 for test case
4 4
5class SetJoin:
6 def __init__(self, n):
7 self._parent = [i for i in range(n)]
8
9 def rep(self, i):
10 return i if self._parent[i] == i else self.rep(self._parent[i])
11
12 def join(self, i, j):
13 self._parent[self.rep(i)] = self.rep(j)
14
15 def sizes(self):
16 sizes = [0] * len(self._parent)
17 for i in range(len(self._parent)):
18 sizes[self.rep(i)] += 1
19 return sizes
20
5with fileinput.input() as lines: 21with fileinput.input() as lines:
6 pts = [tuple(int(x) for x in line[:-1].split(',')) for line in lines] 22 pts = [tuple(int(x) for x in line[:-1].split(',')) for line in lines]
7 23
8r = range(len(pts))
9
10def dist(p, q): 24def dist(p, q):
11 return (p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 25 return (p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2
12 26
27r = range(len(pts))
13d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i]) 28d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i])
14 29
15rep = [i for i in r] 30sj = SetJoin(len(pts))
16
17def findrep(i):
18 return i if rep[i] == i else findrep(rep[i])
19
20def joinrep(i, j):
21 rep[findrep(i)] = findrep(j)
22
23for i in range(N): 31for i in range(N):
24 j, k = d[i][1], d[i][2] 32 j, k = d[i][1], d[i][2]
25 if findrep(j) != findrep(k): 33 if sj.rep(j) != sj.rep(k):
26 joinrep(j, k) 34 sj.join(j, k)
27 35
28sizes = [[0, i] for i in r] 36s = sorted(sj.sizes())
29for i in r: 37print(s[-1] * s[-2] * s[-3])
30 sizes[findrep(i)][0] += 1
31sizes.sort()
32print(sizes[-1][0] * sizes[-2][0] * sizes[-3][0])

Generated with cgit - Back to sebastiano.tronto.net