This commit is contained in:
Stefan Harmuth 2025-12-08 07:07:18 +01:00
parent f6f2e1344b
commit 42bd5367a0
3 changed files with 1089 additions and 0 deletions

69
day08.py Normal file
View File

@ -0,0 +1,69 @@
from tools.aoc import AOCDay
from tools.coordinate import Coordinate
from typing import Any
class Day(AOCDay):
inputs = [
[
(40, "input8_test"),
(140008, "input8"),
],
[
(25272, "input8_test"),
(9253260633, "input8"),
]
]
def parse_input(self) -> tuple[dict[float, Coordinate], dict[Coordinate, int]]:
boxes = [Coordinate(*map(int, line.split(","))) for line in self.getInput()]
dists = {}
for i, box in enumerate(boxes):
for box2 in boxes[i + 1 :]:
dists[box.getDistanceTo(box2)] = (box, box2)
members = {box: i for i, box in enumerate(boxes)}
return dists, members
def solve(self, part2: bool = False) -> int:
dists, members = self.parse_input()
circuits = {i: [box] for box, i in members.items()}
connections_needed = 10 if self.is_test() else 1000
connections_done = 0
last_pair = None
for _, (box0, box1) in sorted(dists.items()):
connections_done += 1
if (not part2 and connections_done > connections_needed) or len(circuits) == 1:
break
if members[box0] == members[box1]:
continue
merger = members[box1]
for box in circuits[merger]:
members[box] = members[box0]
circuits[members[box0]].append(box)
del circuits[merger]
last_pair = (box0, box1)
if part2:
return last_pair[0].x * last_pair[1].x
else:
ans = 1
for _, v in sorted(circuits.items(), key=lambda k: len(k[1]), reverse=True)[:3]:
ans *= len(v)
return ans
def part1(self) -> Any:
return self.solve()
def part2(self) -> Any:
return self.solve(part2=True)
if __name__ == '__main__':
day = Day(2025, 8)
day.run(verbose=True)

1000
inputs/input8 Normal file

File diff suppressed because it is too large Load Diff

20
inputs/input8_test Normal file
View File

@ -0,0 +1,20 @@
162,817,812
57,618,57
906,360,560
592,479,940
352,342,300
466,668,158
542,29,236
431,825,988
739,650,466
52,470,668
216,146,977
819,987,18
117,168,530
805,96,715
346,949,466
970,615,88
941,993,340
862,61,35
984,92,344
425,690,689