summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-04 01:03:12 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-04 01:03:12 -0500
commit42aa5f340f0953451da432d2c6101bf4105a5cda (patch)
tree041b1551f263d022360015f5390403de04ebf088 /src
parent5b39ac0af9c7565a26ec438e8733e093d0890302 (diff)
downloadadvent-of-code-42aa5f340f0953451da432d2c6101bf4105a5cda.tar.gz
advent-of-code-42aa5f340f0953451da432d2c6101bf4105a5cda.zip
day 4
Diffstat (limited to 'src')
-rw-r--r--src/2022/4/mod.rs77
-rw-r--r--src/2022/mod.rs4
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)),
}