1
0
Fork 0

Use RangeInclusive instead, and get second star

This commit is contained in:
Vivianne 2022-12-07 19:51:51 -08:00
parent b14a2306c1
commit eb56d312cc
1 changed files with 39 additions and 6 deletions

View File

@ -1,16 +1,28 @@
#![feature(iterator_try_collect, iter_collect_into)]
#![feature(iterator_try_collect)]
use std::fs;
use std::io::{self, BufRead};
use std::ops::Range;
use std::ops::RangeInclusive;
use std::str::FromStr;
#[derive(Debug)]
struct WorkRange(Range<u32>);
struct WorkRange(RangeInclusive<u32>);
impl WorkRange {
#[allow(dead_code)]
fn init(start: u32, end: u32) -> Self {
WorkRange(start..=end)
}
fn fully_contains(&self, other: &Self) -> bool {
self.0.start <= other.0.start && self.0.end >= other.0.end
self.0.contains(other.0.start()) && self.0.contains(other.0.end())
}
fn overlaps(&self, other: &Self) -> bool {
self.0.contains(other.0.start())
|| self.0.contains(other.0.end())
|| other.0.contains(self.0.start())
|| other.0.contains(self.0.end())
}
}
@ -19,7 +31,7 @@ impl FromStr for WorkRange {
fn from_str(s: &str) -> Result<Self, Self::Err> {
let spl: Vec<u32> = s.split('-').map(|n| n.parse()).try_collect()?;
Ok(WorkRange(spl[0]..spl[1]))
Ok(WorkRange(spl[0]..=spl[1]))
}
}
@ -60,4 +72,25 @@ fn part1(pairs: &[ElfPair]) {
println!("num containing: {}", sum);
}
fn part2(_pairs: &[ElfPair]) {}
fn part2(pairs: &[ElfPair]) {
let sum = pairs
.iter()
.filter(|ElfPair(l, r)| l.overlaps(r) || r.overlaps(l))
.count();
println!("num overlapping: {}", sum);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn range_overlaps() {
assert!(!WorkRange::init(2, 4).overlaps(&WorkRange::init(6, 8)));
assert!(!WorkRange::init(2, 3).overlaps(&WorkRange::init(4, 5)));
assert!(WorkRange::init(5, 7).overlaps(&WorkRange::init(7, 9)));
assert!(WorkRange::init(2, 8).overlaps(&WorkRange::init(3, 7)));
assert!(WorkRange::init(6, 6).overlaps(&WorkRange::init(4, 6)));
assert!(WorkRange::init(2, 6).overlaps(&WorkRange::init(4, 8)));
}
}