From 6a14095ebee68ea59e93cc65ff0d788320b84ac0 Mon Sep 17 00:00:00 2001 From: Yoru Date: Wed, 11 Dec 2024 11:37:30 +0100 Subject: [PATCH] feat: day 11 p1 --- data/examples/11.txt | 0 src/bin/11.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 data/examples/11.txt create mode 100644 src/bin/11.rs diff --git a/data/examples/11.txt b/data/examples/11.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/bin/11.rs b/src/bin/11.rs new file mode 100644 index 0000000..70852e3 --- /dev/null +++ b/src/bin/11.rs @@ -0,0 +1,58 @@ +advent_of_code::solution!(11); + +use std::iter::successors; + +fn update_stones(stones: &Vec) -> Vec { + stones.into_iter().flat_map(|st| + match (st, st.checked_ilog10().unwrap_or(0) + 1) { + (0, _) => vec![1], + (n, digits) if digits % 2 == 0 && digits > 0 => { + let div = 10u64.pow(digits / 2); + vec![ + n / div, + n % div, + ] + }, + _ => vec![st * 2024], + } + ).collect() +} + +fn parse_input(input: &str) -> Result, std::num::ParseIntError> { + input.split_whitespace().map(|c| c.parse::()).collect() +} + +pub fn part_one(input: &str) -> Option { + let stones = parse_input(input).ok()?; + successors(Some(stones), |st| Some(update_stones(st))) + .nth(25) + .unwrap() + .len() + .into() +} + +pub fn part_two(input: &str) -> Option { + let stones = parse_input(input).ok()?; + successors(Some(stones), |st| Some(update_stones(st))) + .nth(75) + .unwrap() + .len() + .into() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part_one() { + let result = part_one("125 17"); + assert_eq!(result, Some(55312)); + } + + #[test] + fn test_part_two() { + let result = part_two(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, None); + } +}