diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-12-04 01:03:12 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-12-04 01:03:12 -0500 |
commit | 42aa5f340f0953451da432d2c6101bf4105a5cda (patch) | |
tree | 041b1551f263d022360015f5390403de04ebf088 /src | |
parent | 5b39ac0af9c7565a26ec438e8733e093d0890302 (diff) | |
download | advent-of-code-42aa5f340f0953451da432d2c6101bf4105a5cda.tar.gz advent-of-code-42aa5f340f0953451da432d2c6101bf4105a5cda.zip |
day 4
Diffstat (limited to 'src')
-rw-r--r-- | src/2022/4/mod.rs | 77 | ||||
-rw-r--r-- | src/2022/mod.rs | 4 |
2 files changed, 81 insertions, 0 deletions
diff --git a/src/2022/4/mod.rs b/src/2022/4/mod.rs new file mode 100644 index 0000000..60aa353 --- /dev/null +++ b/src/2022/4/mod.rs @@ -0,0 +1,77 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +use crate::prelude::*; + +pub struct Pair { + first: (i64, i64), + second: (i64, i64), +} + +impl Pair { + fn contains(&self) -> bool { + range_contains(self.first, self.second) + || range_contains(self.second, self.first) + } + + fn overlaps(&self) -> bool { + range_overlaps(self.first, self.second) + || range_overlaps(self.second, self.first) + } +} + +fn range_contains(a: (i64, i64), b: (i64, i64)) -> bool { + (a.0..=a.1).contains(&b.0) && (a.0..=a.1).contains(&b.1) +} + +fn range_overlaps(a: (i64, i64), b: (i64, i64)) -> bool { + (a.0..=a.1).contains(&b.0) || (a.0..=a.1).contains(&b.1) +} + +pub fn parse(fh: File) -> Result<impl Iterator<Item = Pair>> { + Ok(parse::lines(fh).map(|line| { + let mut parts = line.split(','); + let first = parts.next().unwrap(); + let mut first_parts = first.split('-'); + let second = parts.next().unwrap(); + let mut second_parts = second.split('-'); + Pair { + first: ( + first_parts.next().unwrap().parse().unwrap(), + first_parts.next().unwrap().parse().unwrap(), + ), + second: ( + second_parts.next().unwrap().parse().unwrap(), + second_parts.next().unwrap().parse().unwrap(), + ), + } + })) +} + +pub fn part1(pairs: impl Iterator<Item = Pair>) -> Result<i64> { + Ok(pairs + .filter(|pair| pair.contains()) + .count() + .try_into() + .unwrap()) +} + +pub fn part2(pairs: impl Iterator<Item = Pair>) -> Result<i64> { + Ok(pairs + .filter(|pair| pair.overlaps()) + .count() + .try_into() + .unwrap()) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2022, 4).unwrap()).unwrap()).unwrap(), + 515 + ); + assert_eq!( + part2(parse(parse::data(2022, 4).unwrap()).unwrap()).unwrap(), + 883 + ); +} diff --git a/src/2022/mod.rs b/src/2022/mod.rs index b59d411..1488c13 100644 --- a/src/2022/mod.rs +++ b/src/2022/mod.rs @@ -6,6 +6,8 @@ mod day1; mod day2; #[path = "3/mod.rs"] mod day3; +#[path = "4/mod.rs"] +mod day4; // NEXT MOD pub fn run(day: u8, puzzle: u8) -> Result<i64> { @@ -17,6 +19,8 @@ pub fn run(day: u8, puzzle: u8) -> Result<i64> { (2, 2) => day2::part2(day2::parse(parse::data(2022, 2)?)?), (3, 1) => day3::part1(day3::parse(parse::data(2022, 3)?)?), (3, 2) => day3::part2(day3::parse(parse::data(2022, 3)?)?), + (4, 1) => day4::part1(day4::parse(parse::data(2022, 4)?)?), + (4, 2) => day4::part2(day4::parse(parse::data(2022, 4)?)?), // NEXT PART _ => Err(anyhow!("unknown puzzle {}-{}", day, puzzle)), } |