Skip to content

Commit ee6e389

Browse files
committed
Year 2025 Day 8
1 parent f9c26f0 commit ee6e389

File tree

7 files changed

+107
-4
lines changed

7 files changed

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

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)