From 0f5138df9215e0cce471d1652698a89300b84e55 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Thu, 21 Dec 2023 10:58:35 +0100 Subject: [PATCH] feat: 2023 day six --- src/aoc2023/day06/input.txt | 2 ++ src/aoc2023/day06/mod.rs | 66 +++++++++++++++++++++++++++++++++++++ src/aoc2023/mod.rs | 1 + src/main.rs | 1 + 4 files changed, 70 insertions(+) create mode 100644 src/aoc2023/day06/input.txt create mode 100644 src/aoc2023/day06/mod.rs diff --git a/src/aoc2023/day06/input.txt b/src/aoc2023/day06/input.txt new file mode 100644 index 0000000..9de08c1 --- /dev/null +++ b/src/aoc2023/day06/input.txt @@ -0,0 +1,2 @@ +Time: 46 82 84 79 +Distance: 347 1522 1406 1471 diff --git a/src/aoc2023/day06/mod.rs b/src/aoc2023/day06/mod.rs new file mode 100644 index 0000000..3d86d2f --- /dev/null +++ b/src/aoc2023/day06/mod.rs @@ -0,0 +1,66 @@ +pub fn task_one(input: &str) -> String { + let races = parse_input_for_task_one(input); + let mut product = 1_u64; + + for race in races { + let uprounded_record_speed = (race.record_distance / race.record_time).ceil(); + + let mut count = 0; + + for x in 0..(race.record_time as u32) { + if x > uprounded_record_speed as u32 && (race.record_time - x as f64) * x as f64 > race.record_distance { + count += 1; + } + } + + product *= count + } + + product.to_string() +} + +pub fn task_two(input: &str) -> String { + let race = parse_input_for_task_two(input); + + let uprounded_record_speed = (race.record_distance / race.record_time).ceil(); + + let mut count = 0; + + for x in 0..(race.record_time as u32) { + if x > uprounded_record_speed as u32 && (race.record_time - x as f64) * x as f64 > race.record_distance { + count += 1; + } + } + + count.to_string() +} + +struct Race { + record_time: f64, + record_distance: f64 +} + +fn parse_input_for_task_one(input: &str) -> Vec { + let mut races = Vec::new(); + + let mut iterator = input.lines(); + let (_, times) = iterator.next().unwrap().split_once(':').unwrap(); + let (_, distances) = iterator.next().unwrap().split_once(':').unwrap(); + + for pair in times.split_whitespace().zip(distances.split_whitespace()) { + races.push(Race { record_time: pair.0.parse().unwrap(), record_distance: pair.1.parse().unwrap() }); + } + + races +} + +fn parse_input_for_task_two(input: &str) -> Race { + let mut iterator = input.lines(); + let (_, times) = iterator.next().unwrap().split_once(':').unwrap(); + let (_, distances) = iterator.next().unwrap().split_once(':').unwrap(); + + let record_time = times.split_whitespace().collect::>().join("").parse().unwrap(); + let record_distance = distances.split_whitespace().collect::>().join("").parse().unwrap(); + + Race { record_time, record_distance } +} diff --git a/src/aoc2023/mod.rs b/src/aoc2023/mod.rs index e051fbd..a671a0c 100644 --- a/src/aoc2023/mod.rs +++ b/src/aoc2023/mod.rs @@ -2,3 +2,4 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day06; diff --git a/src/main.rs b/src/main.rs index 53cf338..454815e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,6 +49,7 @@ fn main() { puzzles.push(Puzzle { day: 2, year: 2023, task_one: aoc2023::day02::task_one, task_two: aoc2023::day02::task_two }); puzzles.push(Puzzle { day: 3, year: 2023, task_one: aoc2023::day03::task_one, task_two: aoc2023::day03::task_two }); puzzles.push(Puzzle { day: 4, year: 2023, task_one: aoc2023::day04::task_one, task_two: aoc2023::day04::task_two }); + puzzles.push(Puzzle { day: 6, year: 2023, task_one: aoc2023::day06::task_one, task_two: aoc2023::day06::task_two }); puzzles.iter().for_each(|puzzle| puzzle.solve_and_print()); }