AOC2022/day04/src/main.rs

49 lines
1.6 KiB
Rust

use std::fs;
use std::str::FromStr;
fn main() {
const FILE_PATH: &str = "input";
println!("Hi this is the fourth day of AOC2022, first we will read the file {}", FILE_PATH);
let contents = fs::read_to_string(FILE_PATH)
.expect("Should have been able to read the file");
println!("The ammount of subranges are: {}", contents.lines().map(|l| get_ranges(l)).filter(|t| ranges_contain(t.0,t.1)).count());
println!("The ammount of overlapped ranges are: {}", contents.lines().map(|l| get_ranges(l)).filter(|t| ranges_overlap(t.0,t.1)).count());
}
fn ranges_contain(a: (u32,u32), b: (u32,u32)) -> bool {
!((a.0 > b.0 && a.1 > b.1)||(a.0 < b.0 && a.1 < b.1))
}
fn ranges_overlap(a: (u32,u32), b: (u32,u32)) -> bool {
!((a.0 > b.1 && a.1 > b.1)||(a.0 < b.0 && a.1 < b.0))
}
fn get_ranges(s: &str) -> ((u32, u32),(u32, u32)) {
let mut out = s.split(",");
(get_range(out.next().expect("There must be something")),get_range(out.next().expect("There must be a second elf")))
}
fn get_range(s: &str) -> (u32, u32){
let mut out = s.split("-").map(|n| u32::from_str(n).expect("Must be a number"));
(out.next().expect("There must be something"), out.next().expect("There must be a second number"))
}
#[cfg(test)]
mod test {
const INPUT: &str = r#"2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8"#;
use super::*;
#[test]
fn ranges1() {
assert_eq!(INPUT.lines().map(|l| get_ranges(l)).filter(|t| ranges_contain(t.0,t.1)).count(), 2);
}
#[test]
fn ranges2() {
assert_eq!(INPUT.lines().map(|l| get_ranges(l)).filter(|t| ranges_overlap(t.0,t.1)).count(), 4);
}
}