diff --git a/input/6.txt b/input/6.txt new file mode 100644 index 0000000..869de62 --- /dev/null +++ b/input/6.txt @@ -0,0 +1,2 @@ +Time: 44 80 65 72 +Distance: 208 1581 1050 1102 diff --git a/src/bin/day6.rs b/src/bin/day6.rs new file mode 100644 index 0000000..5024c7a --- /dev/null +++ b/src/bin/day6.rs @@ -0,0 +1,43 @@ +fn main() { + let input = std::fs::read_to_string("input/6.txt").unwrap(); + let (result1, result2) = (part1(&input), part2(&input)); + println!("Day 6"); + println!("Part 1: {}", result1); + println!("Part 2: {}", result2); + println!(); +} + +fn find_hold_time_to_win(time: u64, distance: u64) -> (u64, u64) { + let time = time as f64; + let winning_distance = (distance + 1) as f64; + let discriminant_sqrt = (time * time - 4.0 * winning_distance).sqrt(); + let (min, max) = ((time - discriminant_sqrt) / 2.0, (time + discriminant_sqrt) / 2.0); + let min = (min + 1.0).trunc() as u64; + let max = max.trunc() as u64; + (min, max) +} + +fn part1(input: &str) -> u64 { + let (_, times) = input.lines().next().unwrap().split_once(':').unwrap(); + let times: Vec = times.trim().split_whitespace().map(|t| t.parse().unwrap()).collect(); + let (_, distances) = input.lines().last().unwrap().split_once(':').unwrap(); + let distances: Vec = distances.trim().split_whitespace().map(|d| d.parse().unwrap()).collect(); + let times_and_distances: Vec<(u64, u64)> = times.into_iter().zip(distances.into_iter()).collect(); + let winning_outcomes = times_and_distances.into_iter().map(|(time, distance)| { + let (min, max) = find_hold_time_to_win(time, distance); + let wins = max - min + 1; + wins + }); + winning_outcomes.into_iter().product() +} + +fn part2(input: &str) -> u64 { + let (_, time) = input.lines().next().unwrap().split_once(':').unwrap(); + let time: u64 = time.replace(' ', "").parse().unwrap(); + let (_, distance) = input.lines().last().unwrap().split_once(':').unwrap(); + let distance: u64 = distance.replace(' ', "").parse().unwrap(); + let (min, max) = find_hold_time_to_win(time, distance); + let wins = max - min + 1; + wins +} +