From 3cab145b01e41dee6ad5f525655e2b0aa432933f Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 11 Dec 2024 20:03:06 +0100 Subject: [PATCH] day 11 --- newday.sh | 1 + src/day11.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 4 files changed, 68 insertions(+) create mode 100644 src/day11.rs diff --git a/newday.sh b/newday.sh index 865f693..3a91ee5 100755 --- a/newday.sh +++ b/newday.sh @@ -16,6 +16,7 @@ if ! [[ "$X" =~ ^[0-9]{2}$ ]]; then fi cp src/template.rs src/day$X.rs +git add src/day$X.rs touch input/day$X.txt # Define the placeholder you want to replace diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..b9fb10d --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,65 @@ +use std::{collections::HashMap, fs::read_to_string}; + +pub fn day_main() { + let input = read_to_string("input/day11.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = usize; + +fn part1(input: &str) -> RiddleResult { + solve(input, 25) +} + +fn solve(input: &str, blinks: i32) -> usize { + let mut stones: HashMap = input.split(" ").map(|v| (v.to_string(), 1)).collect(); + let mut next = HashMap::new(); + for _ in 0..blinks { + for (k, v) in stones { + if k.as_str() == "0" { + next.entry("1".to_string()) + .and_modify(|count| *count += v) + .or_insert(v); + } else if k.len() % 2 == 0 { + let (a, b) = k.split_at(k.len() / 2); + next.entry(a.to_string()) + .and_modify(|count| *count += v) + .or_insert(v); + let x = b.parse::().unwrap().to_string(); + next.entry(x).and_modify(|count| *count += v).or_insert(v); + } else { + let d: usize = k.parse().unwrap(); + let k_new = d * 2024; + next.entry(k_new.to_string()) + .and_modify(|count| *count += v) + .or_insert(v); + } + } + stones = next; + next = HashMap::new(); + } + stones.values().to_owned().sum() +} + +fn part2(input: &str) -> RiddleResult { + solve(input, 75) +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r""; + + #[test] + fn test1() { + assert_eq!(part1("125 17"), 55312); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index ff40f6f..cb167e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,5 +8,6 @@ pub mod day07; pub mod day08; pub mod day09; pub mod day10; +pub mod day11; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index f28af20..6a4cda3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ fn main() { (8, day08::day_main), (9, day09::day_main), (10, day10::day_main), + (11, day11::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());