From fcc2250039ce0d395780d622149e944637331b86 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Wed, 6 Dec 2023 15:39:40 +0100 Subject: day6 solution 2 --- src/bin/day6.rs | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/bin/day6.rs b/src/bin/day6.rs index 3d450cb..39f7ade 100644 --- a/src/bin/day6.rs +++ b/src/bin/day6.rs @@ -3,34 +3,47 @@ static DAY: u8 = 6; fn main() { let input = advent::read_lines(DAY); println!("{DAY}a: {}", possible_ways(&input)); - println!("{DAY}b: {}", 0); + println!("{DAY}b: {}", possible_ways_single_race(&input)); } -fn possible_ways(input: &[String]) -> u32 { +fn count_ways(time: u64, record: u64) -> u64 { + let mut ways = 0; + for hold_button in 1 .. time { + let moving_time = time - hold_button; + let boat_distance = moving_time * hold_button; + if boat_distance > record { + ways += 1; + } + } + ways +} + +fn possible_ways(input: &[String]) -> u64 { let get_numbers = |x: &str| { x.split_once(':').unwrap().1.to_string() .split(' ') .filter(|s| !s.is_empty()) .map(|s| s.parse().unwrap()) - .collect::>() + .collect::>() }; let times = get_numbers(&input[0]); let distances = get_numbers(&input[1]); - let mut ways_list = Vec::new(); - for (time, record) in times.iter().zip(distances.iter()) { - let mut ways = 0; - for hold_button in 1 .. *time { - let moving_time = time - hold_button; - let boat_distance = moving_time * hold_button; - if boat_distance > *record { - ways += 1; - } - } - ways_list.push(ways); - } - ways_list.iter() - .product() + times.iter() + .zip(distances.iter()) + .map(|(time, distance)| count_ways(*time, *distance)) + .product() +} + +fn possible_ways_single_race(input: &[String]) -> u64 { + let get_number = |mut x: String| -> u64 { + x.retain(|c| c.is_ascii_digit()); + x.parse().unwrap() + }; + let time = get_number(input[0].clone()); + let distance = get_number(input[1].clone()); + + count_ways(time, distance) } #[cfg(test)] @@ -44,5 +57,6 @@ mod tests { "Distance: 9 40 200", ].iter().map(|&x| String::from(x)).collect::>(); assert_eq!(possible_ways(&input), 288); + assert_eq!(possible_ways_single_race(&input), 71503); } } -- cgit v1.2.3