From db4c3d654228aceafec668ffe2e92130ec73f729 Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Mon, 3 Dec 2018 20:52:57 -0800 Subject: [PATCH] Day 3 --- 2018/src/day3.rs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ 2018/src/main.rs | 2 + 2 files changed, 100 insertions(+) create mode 100644 2018/src/day3.rs diff --git a/2018/src/day3.rs b/2018/src/day3.rs new file mode 100644 index 0000000..7c49fc5 --- /dev/null +++ b/2018/src/day3.rs @@ -0,0 +1,98 @@ +use std::collections::HashMap; +const INPUT: &str = include_str!("input/day3.txt"); + +struct Rectangle { + id: String, + x: u32, + y: u32, + w: u32, + h: u32, +} + +fn parse_input(input: &str) -> Vec { + let mut rects = Vec::new(); + for line in str::lines(input) { + // #id @ x,y: wxh + let mut tokens = Vec::new(); + let mut tok = "".to_string(); + for c in line.chars() { + match c { + ' ' | ',' | 'x' | '@' => { + if !tok.is_empty() { + tokens.push(tok); + } + tok = "".to_string(); + } + '#' | ':' => (), + _ => tok.push(c), + } + } + if !tok.is_empty() { + tokens.push(tok); + } + + let id = tokens[0].to_string(); + let x = tokens[1].parse::().unwrap(); + let y = tokens[2].parse::().unwrap(); + let w = tokens[3].parse::().unwrap(); + let h = tokens[4].parse::().unwrap(); + rects.push(Rectangle { + id: id, + x: x, + y: y, + w: w, + h: h, + }) + } + rects +} + +pub fn part1() -> u32 { + let mut squares = HashMap::new(); + for r in parse_input(INPUT) { + for x in r.x..(r.x + r.w) { + for y in r.y..(r.y + r.h) { + let mut count = squares.entry((x, y)).or_insert(0); + *count += 1; + } + } + } + let mut count = 0; + for (_, layers) in squares { + if layers > 1 { + count += 1; + } + } + count +} + +fn uncovered(grid: &HashMap<(u32, u32), u32>, r: &Rectangle) -> bool { + for x in r.x..(r.x + r.w) { + for y in r.y..(r.y + r.h) { + match grid.get(&(x, y)) { + Some(1) => {} + _ => return false, + } + } + } + true +} + +pub fn part2() -> String { + let mut squares = HashMap::new(); + let rects = parse_input(INPUT); + for r in &rects { + for x in r.x..(r.x + r.w) { + for y in r.y..(r.y + r.h) { + let mut count = squares.entry((x, y)).or_insert(0); + *count += 1; + } + } + } + for r in &rects { + if uncovered(&squares, r) { + return r.id.to_owned(); + } + } + panic!("No solution!") +} diff --git a/2018/src/main.rs b/2018/src/main.rs index d5b58bb..e6cf65f 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -7,4 +7,6 @@ fn main() { println!("Day 1 part 2: {}", day1::part2()); println!("Day 2 part 1: {}", day2::part1()); println!("Day 2 part 2: {}", day2::part2()); + println!("Day 3 part 1: {}", day3::part1()); + println!("Day 3 part 2: {}", day3::part2()); }