From 1b7f4b19bc1b0867b62425624c48e50dcd00f70b Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 6 Dec 2023 00:21:29 -0500 Subject: day 6 --- benches/2023.rs | 5 +++ data/2023/6.txt | 2 ++ src/bin/2023/day6.rs | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/bin/2023/main.rs | 2 ++ 4 files changed, 97 insertions(+) create mode 100644 data/2023/6.txt create mode 100644 src/bin/2023/day6.rs diff --git a/benches/2023.rs b/benches/2023.rs index a9a610b..ebab90c 100644 --- a/benches/2023.rs +++ b/benches/2023.rs @@ -11,6 +11,8 @@ mod day3; mod day4; #[path = "../src/bin/2023/day5.rs"] mod day5; +#[path = "../src/bin/2023/day6.rs"] +mod day6; // NEXT MOD day!(2023, 1, day1); @@ -18,6 +20,7 @@ day!(2023, 2, day2); day!(2023, 3, day3); day!(2023, 4, day4); day!(2023, 5, day5); +day!(2023, 6, day6); // NEXT DAY fn bench_2023(c: &mut criterion::Criterion) { @@ -28,6 +31,7 @@ fn bench_2023(c: &mut criterion::Criterion) { day_combined!(2023, 3, day3); day_combined!(2023, 4, day4); day_combined!(2023, 5, day5); + day_combined!(2023, 6, day6); // NEXT DAY COMBINED }) }); @@ -41,5 +45,6 @@ criterion::criterion_main!( bench_2023day3, bench_2023day4, bench_2023day5, + bench_2023day6, // NEXT GROUP ); diff --git a/data/2023/6.txt b/data/2023/6.txt new file mode 100644 index 0000000..578cc39 --- /dev/null +++ b/data/2023/6.txt @@ -0,0 +1,2 @@ +Time: 40 81 77 72 +Distance: 219 1012 1365 1089 diff --git a/src/bin/2023/day6.rs b/src/bin/2023/day6.rs new file mode 100644 index 0000000..209cfef --- /dev/null +++ b/src/bin/2023/day6.rs @@ -0,0 +1,88 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +use advent_of_code::prelude::*; + +#[derive(Debug)] +pub struct Race { + time: i64, + distance: i64, +} + +impl Race { + fn distance(&self, t: i64) -> i64 { + (self.time - t) * t + } +} + +pub fn parse(fh: File) -> Result> { + let mut lines = parse::raw_lines(fh); + let time = lines.next().unwrap(); + let distance = lines.next().unwrap(); + let times: Vec<_> = time + .split(':') + .nth(1) + .unwrap() + .split_whitespace() + .map(|s| s.parse().unwrap()) + .collect(); + let distances: Vec<_> = distance + .split(':') + .nth(1) + .unwrap() + .split_whitespace() + .map(|s| s.parse().unwrap()) + .collect(); + Ok((0..times.len()) + .map(|i| Race { + time: times[i], + distance: distances[i], + }) + .collect()) +} + +pub fn part1(races: Vec) -> Result { + Ok(races + .into_iter() + .map(|race| -> i64 { + (0..race.time) + .map(|t| race.distance(t)) + .filter(|d| *d > race.distance) + .count() + .try_into() + .unwrap() + }) + .product()) +} + +pub fn part2(races: Vec) -> Result { + let mut real_race = Race { + time: 0, + distance: 0, + }; + for race in races { + real_race.time = + real_race.time * 10i64.pow(race.time.ilog10() + 1) + race.time; + real_race.distance = real_race.distance + * 10i64.pow(race.distance.ilog10() + 1) + + race.distance; + } + Ok((0..real_race.time) + .map(|t| real_race.distance(t)) + .filter(|d| *d > real_race.distance) + .count() + .try_into() + .unwrap()) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2023, 6).unwrap()).unwrap()).unwrap(), + 861300 + ); + assert_eq!( + part2(parse(parse::data(2023, 6).unwrap()).unwrap()).unwrap(), + 28101347 + ); +} diff --git a/src/bin/2023/main.rs b/src/bin/2023/main.rs index 1b896b4..828a8a5 100644 --- a/src/bin/2023/main.rs +++ b/src/bin/2023/main.rs @@ -16,6 +16,7 @@ mod day2; mod day3; mod day4; mod day5; +mod day6; // NEXT MOD #[paw::main] @@ -27,6 +28,7 @@ fn main(opt: Opt) -> Result<()> { 3 => advent_of_code::day!(2023, opt.day, opt.puzzle, day3), 4 => advent_of_code::day!(2023, opt.day, opt.puzzle, day4), 5 => advent_of_code::day!(2023, opt.day, opt.puzzle, day5), + 6 => advent_of_code::day!(2023, opt.day, opt.puzzle, day6), // NEXT PART _ => panic!("unknown day {}", opt.day), } -- cgit v1.2.3-54-g00ecf