You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.7 KiB
Rust

#[derive(Debug)]
struct Assignment {
left: (u32, u32),
right: (u32, u32),
}
fn main() {
let contents = std::fs::read_to_string("data.txt").expect("Failed to read file");
let lines: Vec<&str> = contents.lines().collect();
let assignments: Vec<Assignment> = lines.iter().map(|x| parse_line(&x)).collect();
// Part 1
let num_contained: usize = assignments
.iter()
.map(|a| any_fully_contained(&a))
.filter(|&x| x)
.collect::<Vec<bool>>()
.len();
println!("Number fully contained: {:?}", num_contained);
// Part 2
let num_overlap: usize = assignments
.iter()
.map(|a| any_overlap(&a))
.filter(|&x| x)
.collect::<Vec<bool>>()
.len();
println!("Number overlapping: {:?}", num_overlap);
}
fn parse_line(l: &str) -> Assignment {
let parts: Vec<&str> = l.split(',').collect();
let pairs: Vec<Vec<&str>> = parts.iter().map(|x| x.split('-').collect()).collect();
let pairs: Vec<Vec<u32>> = pairs // map to u32
.iter()
.map(|x| x.iter().map(|y| y.parse().unwrap()).collect())
.collect();
Assignment {
left: (pairs[0][0], pairs[0][1]),
right: (pairs[1][0], pairs[1][1]),
}
}
fn any_fully_contained(a: &Assignment) -> bool {
(a.left.0 <= a.right.0 && a.left.1 >= a.right.1) || // left fully contains right
(a.right.0 <= a.left.0 && a.right.1 >= a.left.1) // or right fully contains left
}
fn any_overlap(a: &Assignment) -> bool {
(a.left.0 >= a.right.0 && a.left.0 <= a.right.1)
|| (a.left.1 >= a.right.0 && a.left.1 <= a.right.1)
|| (a.right.0 >= a.left.0 && a.right.0 <= a.left.1)
|| (a.right.1 >= a.left.0 && a.right.1 <= a.left.1)
}