From 84789395d3aaa256c20b57201415a93dd39aa5d5 Mon Sep 17 00:00:00 2001 From: alex <> Date: Fri, 13 Dec 2024 12:03:59 +0100 Subject: [PATCH] Day11 - part 2 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Enfin ! Indice : mémoïsation (merci kmk). --- src/day11.rs | 55 +++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/src/day11.rs b/src/day11.rs index 0304421..a68832c 100644 --- a/src/day11.rs +++ b/src/day11.rs @@ -1,5 +1,6 @@ use std::error::Error; use std::path::Path; +use std::collections::HashMap; fn split_in_two(value: u64) -> Option<(u64, u64)> { let n_digits = value.ilog10() + 1; @@ -12,43 +13,45 @@ fn split_in_two(value: u64) -> Option<(u64, u64)> { } } -fn count_stones(value: u64, blinks: u32) -> u32 { - if blinks == 0 { - return 1; - } - else if value == 0 { - return count_stones(1, blinks - 1); - } - else { - if let Some((r, l)) = split_in_two(value) { - return count_stones(r, blinks - 1) + count_stones(l, blinks - 1); +fn count_stones(memo: &mut HashMap<(u64, u32), u64>, value: u64, blinks: u32) -> u64 { + if !memo.contains_key(&(value, blinks)) { + if blinks == 0 { + memo.insert((value, blinks), 1); + } + else if value == 0 { + let tmp = count_stones(memo, 1, blinks - 1); + memo.insert((value, blinks), tmp); } else { - return count_stones(value * 2024, blinks - 1); + if let Some((r, l)) = split_in_two(value) { + let tmp = count_stones(memo, r, blinks - 1) + count_stones(memo, l, blinks - 1); + memo.insert((value, blinks), tmp); + } + else { + let tmp = count_stones(memo, value * 2024, blinks - 1); + memo.insert((value, blinks), tmp); + } } } + *memo.get(&(value, blinks)).unwrap() } -fn run_part1(input: &str, blinks: u32) -> Result> { - println!("Running {} - part 1", get_day()); - - let res = input.split_whitespace() +fn solve(input: &str, blinks: u32) -> u64 { + let mut memo: HashMap<(u64, u32), u64> = HashMap::new(); + input.split_whitespace() .map(|v| v.parse::().unwrap()) - .map(|v| count_stones(v, blinks)) - .sum::(); + .map(|v| count_stones(&mut memo, v, blinks)) + .sum::() +} - Ok(res) +fn run_part1(input: &str, blinks: u32) -> Result> { + println!("Running {} - part 1", get_day()); + Ok(solve(input, blinks)) } -fn run_part2(input: &str, blinks: u32) -> Result> { +fn run_part2(input: &str, blinks: u32) -> Result> { println!("Running {} - part 2", get_day()); - - let res = input.split_whitespace() - .map(|v| v.parse::().unwrap()) - .map(|v| count_stones(v, blinks)) - .sum::(); - - Ok(res) + Ok(solve(input, blinks)) } pub fn run(input: &str) -> Result<(), Box> { -- 2.39.5