Loadeksdi's 2022 Advent of Code writeups #4
Topic
The topic of the challenge can be found here
My solution
use std::{
fs::File,
io::{self, BufRead},
path::Path,
};
fn main() {
//part_one();
part_two();
}
// Read input file, taken from rust-by-example
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where
P: AsRef<Path>,
{
let file = File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}
fn part_one() {
let mut overlapping_areas_count = 0;
if let Ok(lines) = read_lines("input.txt") {
for line in lines {
if let Ok(area) = line {
// Split input into two zones, then split each zone into begin and end
let vec: Vec<&str> = area.split(",").collect();
let zone_one: Vec<&str> = vec[0].split("-").collect();
let zone_two: Vec<&str> = vec[1].split("-").collect();
let zone_one_begin: i32 = zone_one[0].parse().unwrap();
let zone_one_end: i32 = zone_one[1].parse().unwrap();
let zone_two_begin: i32 = zone_two[0].parse().unwrap();
let zone_two_end: i32 = zone_two[1].parse().unwrap();
// Check if the two zones fully overlap, if so, increment the counter
if (zone_one_begin >= zone_two_begin && zone_one_end <= zone_two_end)
|| (zone_two_begin >= zone_one_begin && zone_two_end <= zone_one_end)
{
overlapping_areas_count += 1;
}
}
}
}
println!("Number of overlapping areas: {}", overlapping_areas_count);
}
fn part_two() {
let mut overlapping_areas_count = 0;
if let Ok(lines) = read_lines("input.txt") {
for line in lines {
if let Ok(area) = line {
// Split input into two zones, then split each zone into begin and end
let vec: Vec<&str> = area.split(",").collect();
let zone_one: Vec<&str> = vec[0].split("-").collect();
let zone_two: Vec<&str> = vec[1].split("-").collect();
let zone_one_begin: i32 = zone_one[0].parse().unwrap();
let zone_one_end: i32 = zone_one[1].parse().unwrap();
let zone_two_begin: i32 = zone_two[0].parse().unwrap();
let zone_two_end: i32 = zone_two[1].parse().unwrap();
// Check if the two zones partially overlap, if so, increment the counter
if (zone_one_begin >= zone_two_begin && zone_one_begin <= zone_two_end)
|| (zone_one_end >= zone_two_begin && zone_one_end <= zone_two_end)
|| (zone_two_begin >= zone_one_begin && zone_two_begin <= zone_one_end)
|| (zone_two_end >= zone_one_begin && zone_two_end <= zone_one_end)
{
overlapping_areas_count += 1;
}
}
}
}
println!("Number of overlapping areas: {}", overlapping_areas_count);
}