diff options
author | Jesse Luehrs <doy@tozt.net> | 2023-12-06 00:21:29 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2023-12-06 00:21:29 -0500 |
commit | 1b7f4b19bc1b0867b62425624c48e50dcd00f70b (patch) | |
tree | 305c9d33a5c3e2d709e29379362e916804684993 /src/bin | |
parent | 26e5902e47a397b89a5fab3d2d2e81f32120b9be (diff) | |
download | advent-of-code-1b7f4b19bc1b0867b62425624c48e50dcd00f70b.tar.gz advent-of-code-1b7f4b19bc1b0867b62425624c48e50dcd00f70b.zip |
day 6
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/2023/day6.rs | 88 | ||||
-rw-r--r-- | src/bin/2023/main.rs | 2 |
2 files changed, 90 insertions, 0 deletions
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<Vec<Race>> { + 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<Race>) -> Result<i64> { + 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<Race>) -> Result<i64> { + 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), } |