From cfd9b4f2ad1a09bedf7f764f84448a61faab54a3 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 20:26:02 +0200 Subject: Refile for merging repos --- 2018/src/bin/day_3.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 2018/src/bin/day_3.rs (limited to '2018/src/bin/day_3.rs') diff --git a/2018/src/bin/day_3.rs b/2018/src/bin/day_3.rs new file mode 100644 index 0000000..685e288 --- /dev/null +++ b/2018/src/bin/day_3.rs @@ -0,0 +1,76 @@ +extern crate advent_of_code_2018; +use advent_of_code_2018::*; + +use std::str::FromStr; + +use std::error::Error; +use std::path::PathBuf; + +use std::collections::HashMap; + +// cargo watch -cs "cargo run --release --bin day_3" + +#[derive(Debug)] +struct Claim { + id: u32, + x: u32, + y: u32, + w: u32, + h: u32 +} + +impl FromStr for Claim { + type Err = Box; + + fn from_str(s: &str) -> Result { + //#123 @ 3,2: 5x4 + let split = s + .split(|c: char| !c.is_numeric()) + .filter(|s| !s.is_empty()) + .map(|s| s.parse()) + .collect::, _>>()?; + + Ok(Claim { + id: split[0], + x: split[1], + y: split[2], + w: split[3], + h: split[4] + }) + } +} + +fn main() -> Result<(), Box> { + let input = read_file(&PathBuf::from("inputs/3.txt"))?; + let claims = input.iter().map(|line| line.parse::()).collect::, _>>()?; + + let mut claimed = HashMap::new(); + for claim in &claims { + for x in claim.x..claim.x+claim.w { + for y in claim.y..claim.y+claim.h { + *claimed.entry((x,y)).or_insert(0) += 1; + } + } + } + + let conflicts = claimed.values().filter(|&x| *x > 1).count(); + println!("Conflicts: {}", conflicts); + + let conflict_free = claims.iter().filter(|c| check_for_conflicts(c, &claimed)).collect::>(); + + println!("Conflict free: {:?}", conflict_free); + + Ok(()) +} + + +fn check_for_conflicts(claim: &Claim, claimed: &HashMap<(u32, u32), u32>) -> bool { + for x in claim.x..claim.x+claim.w { + for y in claim.y..claim.y+claim.h { + if claimed.get(&(x,y)).map_or(false, |c| *c > 1) { + return false; + } + } + } + true +} -- cgit v1.2.3