From 9890cf9ce5fcb956ec74ff5dfb8c205f116d7f58 Mon Sep 17 00:00:00 2001 From: omagdy7 Date: Wed, 6 Dec 2023 17:03:53 +0200 Subject: Added math solution which is blazingly fast!!! --- 2023/Rust/src/day6.rs | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to '2023/Rust/src') diff --git a/2023/Rust/src/day6.rs b/2023/Rust/src/day6.rs index 5ee6671..68996b6 100644 --- a/2023/Rust/src/day6.rs +++ b/2023/Rust/src/day6.rs @@ -56,6 +56,38 @@ impl From<&str> for Race { } } +fn quadratic_equation(a: f64, b: f64, c: f64) -> (f64, f64) { + let discriminant = b * b - 4.0 * a * c; + let root1 = (-b - discriminant.sqrt()) / (2.0 * a); + let root2 = (-b + discriminant.sqrt()) / (2.0 * a); + // hacky solution to round the first root up and the scond root down + ((root1 + 0.52).round(), (root2 - 0.52).round()) +} + +fn solve_math_two(data: &str) -> u64 { + let race: Race = Race::from(data); + race.times + .iter() + .zip(race.distances.iter()) + .map(|(&time, &distance)| { + let (start, end) = quadratic_equation(1.0, -((time - 0) as f64), distance as f64); + (end - start + 1.0) as usize + }) + .product::() as u64 +} + +fn solve_math_one(data: &str) -> u64 { + let race: Race = Race::from(data); + race.times + .iter() + .zip(race.distances.iter()) + .map(|(&time, &distance)| { + let (start, end) = quadratic_equation(1.0, -((time - 0) as f64), distance as f64); + (end - start + 1.0) as usize + }) + .product::() as u64 +} + fn solve_part_one(data: &str) -> u64 { let race: Race = Race::from(data); race.times @@ -88,8 +120,8 @@ fn solve_part_two(data: &str) -> u64 { fn main() { let test = include_str!("../input/day6.test"); let prod = include_str!("../input/day6.prod"); - println!("part_1 test: {:?}", solve_part_one(test)); - println!("part_1 prod {:?}", solve_part_one(prod)); - println!("part_2 test: {:?}", solve_part_two(test)); - println!("part_2 prod {:?}", solve_part_two(prod)); + println!("part_1 test: {:?}", solve_math_one(test)); + println!("part_1 prod {:?}", solve_math_one(prod)); + println!("part_2 test: {:?}", solve_math_two(test)); + println!("part_2 prod {:?}", solve_math_two(prod)); } -- cgit v1.2.3