From bee665ddb44742ae127a2534675948d00935c840 Mon Sep 17 00:00:00 2001 From: uku Date: Wed, 11 Dec 2024 22:14:22 +0100 Subject: [PATCH] feat(day11): init --- src/solutions/day_11.rs | 69 +++++++++++++++++++++++++++++++++++++++++ src/solutions/mod.rs | 2 ++ 2 files changed, 71 insertions(+) create mode 100644 src/solutions/day_11.rs diff --git a/src/solutions/day_11.rs b/src/solutions/day_11.rs new file mode 100644 index 0000000..a9b61b0 --- /dev/null +++ b/src/solutions/day_11.rs @@ -0,0 +1,69 @@ +use itertools::Itertools; + +use crate::common::{Answer, Solution}; + +pub struct Day11; + +impl Solution for Day11 { + fn name(&self) -> &'static str { + "Plutonian Pebbles" + } + + fn part_a(&self, input: &str) -> Answer { + compute_stones(input, 25).into() + } + + fn part_b(&self, input: &str) -> Answer { + compute_stones(input, 75).into() + } +} + +fn compute_stones(input: &str, iterations: u64) -> usize { + let mut stones = input + .split_whitespace() + .map(|n| n.parse::().unwrap()) + .counts(); + + for _ in 0..iterations { + stones = stones + .into_iter() + .flat_map(|(n, count)| { + if n == 0 { + vec![(1, count)] + } else { + let s = n.to_string(); + if s.len() % 2 == 0 { + let (one, two) = s.split_at(s.len() / 2); + vec![ + (one.parse::().unwrap(), count), + (two.parse::().unwrap(), count), + ] + } else { + vec![(n * 2024, count)] + } + } + }) + .into_grouping_map() + .sum(); + } + + stones.values().sum::() +} + +#[cfg(test)] +mod test { + use super::Day11; + use crate::common::Solution; + + const INPUT: &str = "125 17"; + + #[test] + fn part_a() { + assert_eq!(Day11.part_a(INPUT), 55312.into()); + } + + #[test] + fn part_b() { + assert_eq!(Day11.part_b(INPUT), 65601038650482u64.into()); + } +} diff --git a/src/solutions/mod.rs b/src/solutions/mod.rs index c4d30ca..e5c7a19 100644 --- a/src/solutions/mod.rs +++ b/src/solutions/mod.rs @@ -10,6 +10,7 @@ mod day_07; mod day_08; mod day_09; mod day_10; +mod day_11; pub const SOLUTIONS: &[&dyn Solution] = &[ &day_01::Day01, @@ -22,4 +23,5 @@ pub const SOLUTIONS: &[&dyn Solution] = &[ &day_08::Day08, &day_09::Day09, &day_10::Day10, + &day_11::Day11, ];