Implemented day 6 part 1 and 2 solution

This commit is contained in:
Egor 2023-12-12 16:47:50 +03:00
parent 0e95f67099
commit 77caef29a8
2 changed files with 45 additions and 0 deletions

2
input/6.txt Normal file
View file

@ -0,0 +1,2 @@
Time: 44 80 65 72
Distance: 208 1581 1050 1102

43
src/bin/day6.rs Normal file
View file

@ -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<u64> = times.trim().split_whitespace().map(|t| t.parse().unwrap()).collect();
let (_, distances) = input.lines().last().unwrap().split_once(':').unwrap();
let distances: Vec<u64> = 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
}