Cut down runtime on part 2 of day 6 by 10 times

This commit is contained in:
BoolPurist 2024-08-30 04:06:30 +02:00
parent fd25e8f8db
commit 4970f247f3

View file

@ -8,6 +8,7 @@ type NumericValue = u64;
pub fn solve_task_1(input: &str) -> String { pub fn solve_task_1(input: &str) -> String {
let parsed = parsing::parsing(input); let parsed = parsing::parsing(input);
let mut how_many_times_won = 1; let mut how_many_times_won = 1;
for next_record in parsed { for next_record in parsed {
how_many_times_won *= all_rounds_of_durations(next_record.time()) how_many_times_won *= all_rounds_of_durations(next_record.time())
.into_iter() .into_iter()
@ -48,21 +49,26 @@ pub fn solve_task_2(input: &str) -> String {
unreachable!(); unreachable!();
} }
fn all_rounds_of_durations(duration: NumericValue) -> Vec<NumericValue> { fn all_rounds_of_durations(duration: NumericValue) -> impl Iterator<Item = NumericValue> {
let limit = duration as usize;
std::iter::repeat(duration) std::iter::repeat(duration)
.take(duration as usize) .take(limit)
.enumerate() .enumerate()
.map(|(speed_duration, duration)| { .map(|(speed_duration, duration)| {
simuluate_reached_distance_at(duration, speed_duration as NumericValue) simuluate_reached_distance_at(duration, speed_duration as NumericValue)
}) })
.collect()
} }
fn simuluate_reached_distance_at( fn simuluate_reached_distance_at(
duration: NumericValue, duration: NumericValue,
speed_duration: NumericValue, speed_duration: NumericValue,
) -> NumericValue { ) -> NumericValue {
assert!(duration >= speed_duration); assert!(
duration >= speed_duration,
"Duration {:?}. Speed Duration: {:?}",
duration,
speed_duration
);
let rest_time = duration - speed_duration; let rest_time = duration - speed_duration;
rest_time * speed_duration rest_time * speed_duration
} }