From 00000130fa2839845c36a05856ea045cee539a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Wed, 6 Dec 2023 07:06:16 +0100 Subject: [PATCH] solution: day 6 --- data/examples/06.txt | 2 ++ src/bin/06.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 data/examples/06.txt create mode 100644 src/bin/06.rs diff --git a/data/examples/06.txt b/data/examples/06.txt new file mode 100644 index 000000000..28f5ae9 --- /dev/null +++ b/data/examples/06.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200 diff --git a/src/bin/06.rs b/src/bin/06.rs new file mode 100644 index 000000000..f4be2cb --- /dev/null +++ b/src/bin/06.rs @@ -0,0 +1,63 @@ +use aoc::parsers::to_vec; + +fn win_options((time, distance): (u64, u64)) -> u64 { + let discriminant = ((time.pow(2) - 4 * distance) as f64).sqrt(); + + let first_zero = (time as f64 - discriminant) / 2.0; + let mut second_zero = (time as f64 + discriminant) / 2.0; + + if second_zero.fract() == 0.0 { + second_zero -= 1.0 + } + + second_zero as u64 - first_zero as u64 +} + +pub fn part_one(input: &str) -> Option { + let (upt, upd) = input.split_once('\n')?; + let time: Vec = to_vec(upt.strip_prefix("Time: ")?, ' '); + let distance: Vec = to_vec(upd.strip_prefix("Distance: ")?, ' '); + + Some(time.into_iter().zip(distance).map(win_options).product()) +} + +pub fn part_two(input: &str) -> Option { + let (upt, upd) = input.split_once('\n')?; + let time: u64 = upt + .strip_prefix("Time: ")? + .split(' ') + .flat_map(|x| x.chars()) + .collect::() + .parse() + .ok()?; + let distance: u64 = upd + .strip_prefix("Distance: ")? + .split(' ') + .flat_map(|x| x.chars()) + .collect::() + .parse() + .ok()?; + + Some(win_options((time, distance))) +} + +aoc::solution!(6); + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_part_one() { + assert_eq!( + part_one(&aoc::template::read_file("examples", 6)), + Some(288) + ); + } + #[test] + fn test_part_two() { + assert_eq!( + part_two(&aoc::template::read_file("examples", 6)), + Some(71503) + ); + } +}