diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2025-12-08 08:02:19 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2025-12-08 08:02:19 +0100 |
| commit | bb6a7fd447db8ebafe9df80097821cb0105907f7 (patch) | |
| tree | f90268235abbd37eeddc933208dfffec78ec9eaf /2025/08 | |
| parent | 5d69f923116a2b251a445c0cb9e6f23551ad686a (diff) | |
| download | aoc-bb6a7fd447db8ebafe9df80097821cb0105907f7.tar.gz aoc-bb6a7fd447db8ebafe9df80097821cb0105907f7.zip | |
Refactor
Diffstat (limited to '2025/08')
| -rw-r--r-- | 2025/08/a.py | 39 | ||||
| -rw-r--r-- | 2025/08/b.py | 26 |
2 files changed, 36 insertions, 29 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 | ||
| 3 | N = 1000 # Change to 10 for test case | 3 | N = 1000 # Change to 10 for test case |
| 4 | 4 | ||
| 5 | class 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 | |||
| 5 | with fileinput.input() as lines: | 21 | with 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 | ||
| 8 | r = range(len(pts)) | ||
| 9 | |||
| 10 | def dist(p, q): | 24 | def 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 | ||
| 27 | r = range(len(pts)) | ||
| 13 | d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i]) | 28 | d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i]) |
| 14 | 29 | ||
| 15 | rep = [i for i in r] | 30 | sj = SetJoin(len(pts)) |
| 16 | |||
| 17 | def findrep(i): | ||
| 18 | return i if rep[i] == i else findrep(rep[i]) | ||
| 19 | |||
| 20 | def joinrep(i, j): | ||
| 21 | rep[findrep(i)] = findrep(j) | ||
| 22 | |||
| 23 | for i in range(N): | 31 | for 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 | ||
| 28 | sizes = [[0, i] for i in r] | 36 | s = sorted(sj.sizes()) |
| 29 | for i in r: | 37 | print(s[-1] * s[-2] * s[-3]) |
| 30 | sizes[findrep(i)][0] += 1 | ||
| 31 | sizes.sort() | ||
| 32 | print(sizes[-1][0] * sizes[-2][0] * sizes[-3][0]) | ||
diff --git a/2025/08/b.py b/2025/08/b.py index 4a6d610..0fac672 100644 --- a/2025/08/b.py +++ b/2025/08/b.py | |||
| @@ -1,26 +1,28 @@ | |||
| 1 | import fileinput | 1 | import fileinput |
| 2 | 2 | ||
| 3 | class SetJoin: | ||
| 4 | def __init__(self, n): | ||
| 5 | self._parent = [i for i in range(n)] | ||
| 6 | |||
| 7 | def rep(self, i): | ||
| 8 | return i if self._parent[i] == i else self.rep(self._parent[i]) | ||
| 9 | |||
| 10 | def join(self, i, j): | ||
| 11 | self._parent[self.rep(i)] = self.rep(j) | ||
| 12 | |||
| 3 | with fileinput.input() as lines: | 13 | with fileinput.input() as lines: |
| 4 | pts = [tuple(int(x) for x in line[:-1].split(',')) for line in lines] | 14 | pts = [tuple(int(x) for x in line[:-1].split(',')) for line in lines] |
| 5 | 15 | ||
| 6 | r = range(len(pts)) | ||
| 7 | |||
| 8 | def dist(p, q): | 16 | def dist(p, q): |
| 9 | return (p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 | 17 | return (p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 |
| 10 | 18 | ||
| 19 | r = range(len(pts)) | ||
| 11 | d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i]) | 20 | d = sorted([(dist(pts[i], pts[j]), i, j) for i in r for j in r if j > i]) |
| 12 | 21 | ||
| 13 | rep = [i for i in r] | 22 | sj = SetJoin(len(pts)) |
| 14 | |||
| 15 | def findrep(i): | ||
| 16 | return i if rep[i] == i else findrep(rep[i]) | ||
| 17 | |||
| 18 | def joinrep(i, j): | ||
| 19 | rep[findrep(i)] = findrep(j) | ||
| 20 | |||
| 21 | for _, j, k in d: | 23 | for _, j, k in d: |
| 22 | if findrep(j) != findrep(k): | 24 | if sj.rep(j) != sj.rep(k): |
| 23 | joinrep(j, k) | 25 | sj.join(j, k) |
| 24 | sol = pts[j][0] * pts[k][0] | 26 | sol = pts[j][0] * pts[k][0] |
| 25 | 27 | ||
| 26 | print(sol) | 28 | print(sol) |
