From 000001502271adcc13d5ba3fee615c92a5ea1c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Wed, 11 Dec 2024 06:37:27 +0100 Subject: [PATCH] solution: day 11 --- data/examples/11.txt | 1 + src/bin/11.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 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 000000000..9b26c84 --- /dev/null +++ b/data/examples/11.txt @@ -0,0 +1 @@ +125 17 diff --git a/src/bin/11.rs b/src/bin/11.rs new file mode 100644 index 000000000..1422a97 --- /dev/null +++ b/src/bin/11.rs @@ -0,0 +1,72 @@ +use std::mem::swap; + +use hashbrown::HashMap; +use itertools::Itertools; + +fn blink(map: &HashMap, nmap: &mut HashMap) { + for (&k, &v) in map.iter() { + match k { + 0 => *nmap.entry(1).or_default() += v, + x if (x.ilog10() + 1) % 2 == 0 => { + let xlen = x.ilog10() + 1; + let xhalf = 10_usize.pow(xlen / 2); + + *nmap.entry(x / xhalf).or_default() += v; + *nmap.entry(x % xhalf).or_default() += v; + } + x => *nmap.entry(x * 2024).or_default() += v, + } + } +} + +fn solve(input: &str, blinks: usize) -> usize { + let v = input + .split(" ") + .filter_map(|x| x.parse().ok()) + .collect_vec(); + + let mut map = HashMap::::new(); + + for vv in v { + *map.entry(vv).or_default() += 1; + } + + let mut nmap = HashMap::::new(); + + for _ in 0..blinks { + blink(&map, &mut nmap); + map.clear(); + swap(&mut map, &mut nmap); + } + + map.values().sum() +} + +pub fn part_one(input: &str) -> Option { + solve(input, 25).into() +} + +pub fn part_two(input: &str) -> Option { + solve(input, 75).into() +} + +aoc::solution!(11); + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_part_one() { + assert_eq!( + part_one(&aoc::template::read_file("examples", 11)), + Some(55312) + ); + } + #[test] + fn test_part_two() { + assert_eq!( + part_two(&aoc::template::read_file("examples", 11)), + Some(65601038650482) + ); + } +}