day 4. cruisin
parent
a502096736
commit
a468a9b122
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "day4"
|
||||
version = "0.1.0"
|
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "day4"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,55 @@
|
||||
#[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)
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
2-4,6-8
|
||||
2-3,4-5
|
||||
5-7,7-9
|
||||
2-8,3-7
|
||||
6-6,4-6
|
||||
2-6,4-8
|
Loading…
Reference in New Issue