From 70894fa3a8e6cd9a44aed17f229b2bb3e77d1ecf Mon Sep 17 00:00:00 2001 From: george Date: Sun, 4 Dec 2022 13:52:09 +0000 Subject: [PATCH] day 4 --- .gitignore | 3 +-- day04/Cargo.lock | 7 ++++++ day04/Cargo.toml | 8 +++++++ day04/src/main.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 day04/Cargo.lock create mode 100644 day04/Cargo.toml create mode 100644 day04/src/main.rs diff --git a/.gitignore b/.gitignore index f5d7f64..e9db1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ target/ -input -testinput +*input main diff --git a/day04/Cargo.lock b/day04/Cargo.lock new file mode 100644 index 0000000..b8f9a18 --- /dev/null +++ b/day04/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "day04" +version = "0.1.0" diff --git a/day04/Cargo.toml b/day04/Cargo.toml new file mode 100644 index 0000000..aa462dc --- /dev/null +++ b/day04/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day04" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day04/src/main.rs b/day04/src/main.rs new file mode 100644 index 0000000..674ba03 --- /dev/null +++ b/day04/src/main.rs @@ -0,0 +1,59 @@ +use std::io::{self, BufRead}; +use std::num::ParseIntError; +use std::str::FromStr; + +#[derive(Debug)] +struct Pair { + first: (usize, usize), + second: (usize, usize), +} + +fn main() { + let pairs = io::stdin() + .lock() + .lines() + .map(|l| Pair::from_str(l.unwrap().as_str()).unwrap()); + + let mut full_overlap = 0; + let mut partial_overlap = 0; + + for pair in pairs { + if (pair.first.0 >= pair.second.0 && pair.first.1 <= pair.second.1) + || (pair.first.0 <= pair.second.0 && pair.first.1 >= pair.second.1) + { + full_overlap += 1; + } + + if (pair.first.0 >= pair.second.0 && pair.first.0 <= pair.second.1) + || (pair.first.1 >= pair.second.0 && pair.first.1 <= pair.second.1) + || (pair.second.0 >= pair.first.0 && pair.second.0 <= pair.first.1) + || (pair.second.1 >= pair.first.0 && pair.second.1 <= pair.first.1) + { + partial_overlap += 1; + } + } + + println!("P1: {}, P2: {}", full_overlap, partial_overlap); +} + +impl FromStr for Pair { + type Err = ParseIntError; + + fn from_str(s: &str) -> Result { + let (first, second) = s.split_once(',').unwrap(); + let first_half = first.split_once('-').unwrap(); + let first_half = ( + first_half.0.parse::().unwrap(), + first_half.1.parse::().unwrap(), + ); + let second_half = second.split_once('-').unwrap(); + let second_half = ( + second_half.0.parse::().unwrap(), + second_half.1.parse::().unwrap(), + ); + Ok(Pair { + first: first_half, + second: second_half, + }) + } +}