Skip to content

Commit ce64428

Browse files
committed
Day 11
1 parent d3c401d commit ce64428

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www.
3535
| [Day 7](./src/bin/07.rs) | `80.3µs` | `113.7µs` |
3636
| [Day 8](./src/bin/08.rs) | `10.2µs` | `12.4µs` |
3737
| [Day 9](./src/bin/09.rs) | `2.9ms` | `49.1ms` |
38-
| [Day 10](./src/bin/10.rs) | `95.6µs` | `96.8µs` |
38+
| [Day 10](./src/bin/10.rs) | `96.9µs` | `97.3µs` |
39+
| [Day 11](./src/bin/11.rs) | `216.1µs` | `10.9ms` |
3940

40-
**Total: 176.11ms**
41+
**Total: 187.23ms**
4142
<!--- benchmarking table --->
4243

4344
---

data/examples/11.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
125 17

src/bin/11.rs

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use itertools::Itertools;
2+
use std::collections::HashMap;
3+
4+
advent_of_code::solution!(11);
5+
6+
fn blink(stone: u64, iterations_left: usize, memo: &mut HashMap<(u64, usize), u64>) -> u64 {
7+
if iterations_left == 0 {
8+
return 1;
9+
}
10+
if let Some(cached_value) = memo.get(&(stone, iterations_left)) {
11+
return *cached_value;
12+
}
13+
14+
let (first_half, second_half) = blink_stone(stone);
15+
let mut sum = blink(first_half, iterations_left - 1, memo);
16+
if let Some(second_half) = second_half { sum += blink(second_half, iterations_left - 1, memo); }
17+
18+
memo.insert((stone, iterations_left), sum);
19+
20+
sum
21+
}
22+
23+
fn blink_stone(stone: u64) -> (u64, Option<u64>) {
24+
if stone == 0 {
25+
return (1, None);
26+
}
27+
28+
let digits = stone.ilog10() + 1;
29+
if digits % 2 != 0 {
30+
return (stone * 2024, None)
31+
}
32+
let divisor = 10u64.pow(digits / 2);
33+
let first_half = stone / divisor;
34+
let second_half = stone % divisor;
35+
(first_half, Some(second_half))
36+
}
37+
38+
pub fn part_one(input: &str) -> Option<u64> {
39+
let stones = input.split_ascii_whitespace().map(|number| number.parse::<u64>().unwrap()).collect_vec();
40+
let mut memo = HashMap::new();
41+
Some(stones.iter().map(|stone| blink(*stone, 25, &mut memo)).sum())
42+
}
43+
44+
pub fn part_two(input: &str) -> Option<u64> {
45+
let stones = input.split_ascii_whitespace().map(|number| number.parse::<u64>().unwrap()).collect_vec();
46+
let mut memo = HashMap::new();
47+
Some(stones.iter().map(|stone| blink(*stone, 75, &mut memo)).sum())
48+
}
49+
50+
#[cfg(test)]
51+
mod tests {
52+
use super::*;
53+
54+
#[test]
55+
fn test_part_one() {
56+
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
57+
assert_eq!(result, Some(55312));
58+
}
59+
60+
#[test]
61+
fn test_part_two() {
62+
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
63+
assert_eq!(result, Some(65601038650482));
64+
}
65+
}

0 commit comments

Comments
 (0)