Skip to content

Commit 15aad26

Browse files
committed
Year 2025 Day 8
1 parent f9c26f0 commit 15aad26

File tree

7 files changed

+109
-4
lines changed

7 files changed

+109
-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) | 13000 |
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: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
pub fn parse(input: &str) -> Input {
10+
let boxes: Vec<_> = input.iter_unsigned::<u64>().chunk::<3>().collect();
11+
let mut pairs = Vec::with_capacity(boxes.len() * (boxes.len() - 1));
12+
13+
for (i, &v1) in boxes.iter().enumerate() {
14+
for (j, &v2) in boxes.iter().enumerate().skip(i + 1) {
15+
let dx = v1[0].abs_diff(v2[0]);
16+
let dy = v1[1].abs_diff(v2[1]);
17+
let dz = v1[2].abs_diff(v2[2]);
18+
let distance = dx * dx + dy * dy + dz * dz;
19+
pairs.push((i, j, distance));
20+
}
21+
}
22+
23+
pairs.sort_unstable_by_key(|&(.., distance)| distance);
24+
(boxes, pairs)
25+
}
26+
27+
pub fn part1(input: &Input) -> usize {
28+
part1_testable(input, 1000)
29+
}
30+
31+
pub fn part1_testable(input: &Input, limit: usize) -> usize {
32+
let (boxes, pairs) = input;
33+
let mut sets: Vec<_> = (0..boxes.len()).map(|i| vec![i]).collect();
34+
35+
for (i, j, ..) in pairs.iter().take(limit) {
36+
let first = (0..sets.len()).find(|&k| sets[k].contains(i)).unwrap();
37+
let second = (0..sets.len()).find(|&k| sets[k].contains(j)).unwrap();
38+
39+
let min = first.min(second);
40+
let max = first.max(second);
41+
42+
if min != max {
43+
let other = sets.remove(max);
44+
sets[min].extend(other);
45+
}
46+
}
47+
48+
let mut sizes: Vec<_> = sets.iter().map(Vec::len).collect();
49+
sizes.sort_unstable();
50+
sizes.iter().rev().take(3).product()
51+
}
52+
53+
pub fn part2(input: &Input) -> u64 {
54+
let (boxes, pairs) = input;
55+
let mut seen = vec![false; boxes.len()];
56+
let mut remaining = boxes.len();
57+
58+
for &(i, j, _) in pairs {
59+
remaining -= usize::from(!seen[i]) + usize::from(!seen[j]);
60+
seen[i] = true;
61+
seen[j] = true;
62+
63+
if remaining == 0 {
64+
return boxes[i][0] * boxes[j][0];
65+
}
66+
}
67+
68+
unreachable!()
69+
}

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)