Add Day 4 solution
This commit is contained in:
parent
6992a9f3d7
commit
b2b5248771
|
@ -6,3 +6,4 @@ edition = "2021"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
regex = "1"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,60 @@
|
|||
use std::fs::File;
|
||||
use std::io::BufRead;
|
||||
use std::io::BufReader;
|
||||
|
||||
use regex::Regex;
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
struct ElfAssignment {
|
||||
first_range_start: u8,
|
||||
first_range_end: u8,
|
||||
second_range_start: u8,
|
||||
second_range_end: u8,
|
||||
}
|
||||
|
||||
pub fn run() {
|
||||
let file = File::open("resources/day4input.txt").expect("Input file not found.");
|
||||
let reader = BufReader::new(file);
|
||||
|
||||
let re = Regex::new(r"^(\d{1,2})-(\d{1,2}),(\d{1,2})-(\d{1,2})$").unwrap();
|
||||
let assignments: Vec<Option<ElfAssignment>> = reader
|
||||
.lines()
|
||||
.map(|line| {
|
||||
let unwrapped_line = line.unwrap();
|
||||
let cap = re.captures(unwrapped_line.as_str()).unwrap();
|
||||
let groups = (cap.get(1), cap.get(2), cap.get(3), cap.get(4));
|
||||
match groups {
|
||||
(Some(r1), Some(r2), Some(r3), Some(r4)) => Some(ElfAssignment {
|
||||
first_range_start: r1.as_str().parse::<u8>().unwrap(),
|
||||
first_range_end: r2.as_str().parse::<u8>().unwrap(),
|
||||
second_range_start: r3.as_str().parse::<u8>().unwrap(),
|
||||
second_range_end: r4.as_str().parse::<u8>().unwrap(),
|
||||
}),
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let mut total_overlap: u32 = 0;
|
||||
let mut partial_overlap: u32 = 0;
|
||||
|
||||
for assignment in assignments {
|
||||
let a = assignment.unwrap();
|
||||
if (a.first_range_start >= a.second_range_start
|
||||
&& a.first_range_end <= a.second_range_end) ||
|
||||
(a.second_range_start >= a.first_range_start
|
||||
&& a.second_range_end <= a.first_range_end) {
|
||||
total_overlap += 1;
|
||||
}
|
||||
|
||||
if ((a.first_range_start >= a.second_range_start && a.first_range_start <= a.second_range_end) ||
|
||||
(a.first_range_end >= a.second_range_start && a.first_range_end <= a.second_range_end)) ||
|
||||
((a.second_range_start >= a.first_range_start && a.second_range_start <= a.first_range_end) ||
|
||||
(a.second_range_end >= a.first_range_start && a.second_range_end <= a.first_range_end)) {
|
||||
partial_overlap += 1;
|
||||
}
|
||||
}
|
||||
|
||||
println!("Day 4 Answer 1: {:?}", total_overlap);
|
||||
println!("Day 4 Answer 2: {:?}", partial_overlap);
|
||||
}
|
|
@ -3,6 +3,7 @@ use std::env;
|
|||
mod day1;
|
||||
mod day2;
|
||||
mod day3;
|
||||
mod day4;
|
||||
|
||||
fn main() {
|
||||
let args: Vec<String> = env::args().collect();
|
||||
|
@ -13,6 +14,7 @@ fn main() {
|
|||
"day1" => day1::run(),
|
||||
"day2" => day2::run(),
|
||||
"day3" => day3::run(),
|
||||
"day4" => day4::run(),
|
||||
_ => eprintln!("error: invalid day")
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue