Skip to content

Commit 83d5303

Browse files
committed
Year 2025 Day 8
1 parent f9c26f0 commit 83d5303

File tree

7 files changed

+125
-4
lines changed

7 files changed

+125
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Performance is reasonable even on older hardware, for example a 2011 MacBook Pro
8484
| 5 | [Cafeteria](https://adventofcode.com/2025/day/5) | [Source](src/year2025/day05.rs) | 20 |
8585
| 6 | [Trash Compactor](https://adventofcode.com/2025/day/6) | [Source](src/year2025/day06.rs) | 20 |
8686
| 7 | [Laboratories](https://adventofcode.com/2025/day/7) | [Source](src/year2025/day07.rs) | 5 |
87+
| 8 | [Playground](https://adventofcode.com/2025/day/8) | [Source](src/year2025/day08.rs) | 12000 |
8788

8889
## 2024
8990

benches/benchmark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,5 +95,5 @@ benchmark!(year2024
9595
);
9696

9797
benchmark!(year2025
98-
day01, day02, day03, day04, day05, day06, day07
98+
day01, day02, day03, day04, day05, day06, day07, day08
9999
);

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,5 @@ library!(year2024 "Locate the Chief Historian in time for the big Christmas slei
7474
);
7575

7676
library!(year2025 "Finish the North Pole decorations in time for Christmas."
77-
day01, day02, day03, day04, day05, day06, day07
77+
day01, day02, day03, day04, day05, day06, day07, day08
7878
);

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,5 +141,5 @@ run!(year2024
141141
);
142142

143143
run!(year2025
144-
day01, day02, day03, day04, day05, day06, day07
144+
day01, day02, day03, day04, day05, day06, day07, day08
145145
);

src/year2025/day08.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
//! # Playground
2+
use crate::util::iter::*;
3+
use crate::util::parse::*;
4+
5+
type Box = [u64; 3];
6+
type Pair = (usize, usize, u64);
7+
type Input = (Vec<Box>, Vec<Pair>);
8+
9+
struct Node {
10+
parent: usize,
11+
size: usize,
12+
}
13+
14+
pub fn parse(input: &str) -> Input {
15+
let boxes: Vec<_> = input.iter_unsigned::<u64>().chunk::<3>().collect();
16+
let mut pairs = Vec::with_capacity(boxes.len() * (boxes.len() - 1));
17+
18+
for (i, &v1) in boxes.iter().enumerate() {
19+
for (j, &v2) in boxes.iter().enumerate().skip(i + 1) {
20+
let dx = v1[0].abs_diff(v2[0]);
21+
let dy = v1[1].abs_diff(v2[1]);
22+
let dz = v1[2].abs_diff(v2[2]);
23+
let distance = dx * dx + dy * dy + dz * dz;
24+
pairs.push((i, j, distance));
25+
}
26+
}
27+
28+
pairs.sort_unstable_by_key(|&(.., distance)| distance);
29+
(boxes, pairs)
30+
}
31+
32+
pub fn part1(input: &Input) -> usize {
33+
part1_testable(input, 1000)
34+
}
35+
36+
pub fn part1_testable(input: &Input, limit: usize) -> usize {
37+
let (boxes, pairs) = input;
38+
let mut nodes: Vec<_> = (0..boxes.len()).map(|i| Node { parent: i, size: 1 }).collect();
39+
40+
for &(i, j, ..) in pairs.iter().take(limit) {
41+
union(&mut nodes, i, j);
42+
}
43+
44+
nodes.sort_unstable_by_key(|node| node.size);
45+
nodes.iter().rev().take(3).map(|node| node.size).product()
46+
}
47+
48+
pub fn part2(input: &Input) -> u64 {
49+
let (boxes, pairs) = input;
50+
let mut nodes: Vec<_> = (0..boxes.len()).map(|i| Node { parent: i, size: 1 }).collect();
51+
52+
for &(i, j, ..) in pairs {
53+
if union(&mut nodes, i, j) == boxes.len() {
54+
return boxes[i][0] * boxes[j][0];
55+
}
56+
}
57+
58+
unreachable!()
59+
}
60+
61+
fn find(set: &mut [Node], mut x: usize) -> usize {
62+
while set[x].parent != x {
63+
let parent = set[x].parent;
64+
(x, set[x].parent) = (parent, set[parent].parent);
65+
}
66+
67+
x
68+
}
69+
70+
fn union(set: &mut [Node], mut x: usize, mut y: usize) -> usize {
71+
x = find(set, x);
72+
y = find(set, y);
73+
74+
if x == y {
75+
return set[x].size;
76+
}
77+
78+
if set[x].size < set[y].size {
79+
(x, y) = (y, x);
80+
}
81+
82+
set[y].parent = x;
83+
set[x].size += set[y].size;
84+
set[x].size
85+
}

tests/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,5 @@ test!(year2024
8787
);
8888

8989
test!(year2025
90-
day01, day02, day03, day04, day05, day06, day07
90+
day01, day02, day03, day04, day05, day06, day07, day08
9191
);

tests/year2025/day08.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use aoc::year2025::day08::*;
2+
3+
const EXAMPLE: &str = "\
4+
162,817,812
5+
57,618,57
6+
906,360,560
7+
592,479,940
8+
352,342,300
9+
466,668,158
10+
542,29,236
11+
431,825,988
12+
739,650,466
13+
52,470,668
14+
216,146,977
15+
819,987,18
16+
117,168,530
17+
805,96,715
18+
346,949,466
19+
970,615,88
20+
941,993,340
21+
862,61,35
22+
984,92,344
23+
425,690,689";
24+
25+
#[test]
26+
fn part1_test() {
27+
let input = parse(EXAMPLE);
28+
assert_eq!(part1_testable(&input, 10), 40);
29+
}
30+
31+
#[test]
32+
fn part2_test() {
33+
let input = parse(EXAMPLE);
34+
assert_eq!(part2(&input), 25272);
35+
}

0 commit comments

Comments
 (0)