day 4
This commit is contained in:
parent
3bc97158bc
commit
19d28ea991
@ -19,6 +19,10 @@ path = "src/day2.rs"
|
|||||||
name = "day3"
|
name = "day3"
|
||||||
path = "src/day3.rs"
|
path = "src/day3.rs"
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "day4"
|
||||||
|
path = "src/day4.rs"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
89
2022/src/day4.rs
Normal file
89
2022/src/day4.rs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
const DATA: &'static str = include_str!("../data/day4.txt");
|
||||||
|
// const DATA: &'static str = "
|
||||||
|
// 2-4,6-8
|
||||||
|
// 2-3,4-5
|
||||||
|
// 5-7,7-9
|
||||||
|
// 2-8,3-7
|
||||||
|
// 6-6,4-6
|
||||||
|
// 2-6,4-8
|
||||||
|
// ";
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum DataError {
|
||||||
|
NotANumber,
|
||||||
|
NotAPair,
|
||||||
|
NotARange,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct Range {
|
||||||
|
start: u32,
|
||||||
|
end: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Range {
|
||||||
|
fn contains(&self, other: &Range) -> bool {
|
||||||
|
self.start <= other.start && self.end >= other.end
|
||||||
|
}
|
||||||
|
|
||||||
|
fn overlaps(&self, other: &Range) -> bool {
|
||||||
|
// what if self.start == other.start or self.end == other.end?
|
||||||
|
if self.start <= other.start && self.end >= other.start {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.start <= other.end && self.end >= other.end {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::str::FromStr for Range {
|
||||||
|
type Err = DataError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Range, DataError> {
|
||||||
|
let mut bounds = s.split('-');
|
||||||
|
|
||||||
|
let start = bounds.next()
|
||||||
|
.ok_or(DataError::NotARange)?
|
||||||
|
.parse::<u32>()
|
||||||
|
.map_err(|_e| DataError::NotANumber)?;
|
||||||
|
let end = bounds.next()
|
||||||
|
.ok_or(DataError::NotARange)?
|
||||||
|
.parse::<u32>()
|
||||||
|
.map_err(|_e| DataError::NotANumber)?;
|
||||||
|
|
||||||
|
Ok(Range {start, end})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main() -> Result<(), DataError> {
|
||||||
|
let ranges = DATA.trim()
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
let mut pairs = line.split(',');
|
||||||
|
let left: Range = pairs.next()
|
||||||
|
.ok_or(DataError::NotAPair)?
|
||||||
|
.parse()?;
|
||||||
|
let right: Range = pairs.next()
|
||||||
|
.ok_or(DataError::NotAPair)?
|
||||||
|
.parse()?;
|
||||||
|
Ok((left, right))
|
||||||
|
})
|
||||||
|
.collect::<Result<Vec<(Range, Range)>, DataError>>()?;
|
||||||
|
|
||||||
|
let total_supersets = ranges.iter()
|
||||||
|
.filter(|(a, b)| a.contains(b) || b.contains(a))
|
||||||
|
.count();
|
||||||
|
println!("Part 1: {total_supersets}");
|
||||||
|
|
||||||
|
let total_overlaps = ranges.iter()
|
||||||
|
.filter(|(a, b)| a.overlaps(b) || b.contains(a) || a.contains(b))
|
||||||
|
.count();
|
||||||
|
println!("Part 2: {total_overlaps}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user