summaryrefslogtreecommitdiff
path: root/2023/Rust/src
diff options
context:
space:
mode:
authoromagdy7 <omar.professional8777@gmail.com>2023-12-06 17:03:53 +0200
committeromagdy7 <omar.professional8777@gmail.com>2023-12-06 17:03:53 +0200
commit9890cf9ce5fcb956ec74ff5dfb8c205f116d7f58 (patch)
tree89f465f91cb40d71b0fd06a36c6c952bc8484c26 /2023/Rust/src
parent0d4812c188b2fabadc520b626caa824808e9af96 (diff)
downloadaoc-9890cf9ce5fcb956ec74ff5dfb8c205f116d7f58.tar.xz
aoc-9890cf9ce5fcb956ec74ff5dfb8c205f116d7f58.zip
Added math solution which is blazingly fast!!!
Diffstat (limited to '2023/Rust/src')
-rw-r--r--2023/Rust/src/day6.rs40
1 files changed, 36 insertions, 4 deletions
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<Part2> {
}
}
+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<Part2> = 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::<usize>() as u64
+}
+
+fn solve_math_one(data: &str) -> u64 {
+ let race: Race<Part1> = 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::<usize>() as u64
+}
+
fn solve_part_one(data: &str) -> u64 {
let race: Race<Part1> = 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));
}