Skip to content

Commit 7eb1f1b

Browse files
committed
solve: day11
1 parent d239fe3 commit 7eb1f1b

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"utils",
5-
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10",
5+
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9", "day10", "day11",
66
]
77

88
[workspace.dependencies]

day11/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day11"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_derive'
8+
utils.path = '../utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day11/src/main.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use std::collections::HashMap;
2+
3+
use aoc_derive::aoc_main;
4+
use itertools::Itertools;
5+
use utils::*;
6+
7+
fn iterate(stone: usize, depth: usize, cache: &mut HashMap<(usize, usize), usize>) -> usize {
8+
if depth == 0 {
9+
return 1;
10+
}
11+
12+
if let Some(cached) = cache.get(&(stone, depth)) {
13+
*cached
14+
} else {
15+
let count = if stone == 0 {
16+
iterate(1, depth - 1, cache)
17+
} else {
18+
let s = stone.to_string();
19+
if s.len() % 2 == 0 {
20+
iterate(s[s.len() / 2..].parse().unwrap(), depth - 1, cache)
21+
+ iterate(s[..s.len() / 2].parse().unwrap(), depth - 1, cache)
22+
} else {
23+
iterate(stone * 2024, depth - 1, cache)
24+
}
25+
};
26+
cache.insert((stone, depth), count);
27+
count
28+
}
29+
}
30+
31+
#[aoc_main]
32+
fn solve(input: Input) -> impl Into<Solution> {
33+
let stones = input.as_str().split(' ').flat_map(str::parse).collect_vec();
34+
35+
let mut cache = HashMap::new();
36+
(
37+
stones.iter().map(|stone| iterate(*stone, 25, &mut cache)).sum_usize(),
38+
stones.iter().map(|stone| iterate(*stone, 75, &mut cache)).sum_usize(),
39+
)
40+
}
41+
42+
#[cfg(test)]
43+
mod tests {
44+
use super::*;
45+
#[test]
46+
fn test_examples() {
47+
use utils::assert_example;
48+
assert_example!("125 17", 55312);
49+
}
50+
}

0 commit comments

Comments
 (0)