From 78f7f2db497085269f2098cc60bf49e32ca82969 Mon Sep 17 00:00:00 2001 From: sepia Date: Wed, 11 Dec 2024 11:29:50 -0600 Subject: [PATCH] Day 11 --- src/day11.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +++- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/day11.rs diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..384781f --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; + +const BLINKS: usize = 75; + +// (value, blinks_remaining) +type Stone = (u64, usize); + +pub fn day11() { + let mut lut: HashMap = HashMap::new(); + let count: usize = crate::input(11) + .split_whitespace() + .map(|s| s.parse().unwrap()) + .map(|v| blink((v, BLINKS), &mut lut)) + .sum(); + + println!("Total Stones: {}", count); +} + +fn blink(stone: Stone, lut: &mut HashMap) -> usize { + if let Some(&count) = lut.get(&stone) { + return count; + } + + let blinked = blink_single(stone); + + let count = match stone.1 { + 1 => blinked.len(), + _ => blinked.iter().map(|&s| blink(s, lut)).sum(), + }; + + lut.insert(stone, count); + count +} + +fn blink_single((v, b): Stone) -> Vec { + match v.to_string().as_str() { + "0" => vec![(1, b - 1)], + s if s.len() % 2 == 0 => { + let mid = s.len() / 2; + vec![ + (s[..mid].parse().unwrap(), b - 1), + (s[mid..].parse().unwrap(), b - 1), + ] + } + _ => vec![(v * 2024, b - 1)], + } +} diff --git a/src/main.rs b/src/main.rs index 5bd596f..e8e0ef8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,10 +16,12 @@ mod day7; mod day8; #[allow(dead_code)] mod day9; +#[allow(dead_code)] mod day10; +mod day11; fn main() { - day10::day10(); + day11::day11(); } pub fn input(day: u8) -> String {