Day 3
This commit is contained in:
parent
84b67b5140
commit
db4c3d6542
2 changed files with 100 additions and 0 deletions
98
2018/src/day3.rs
Normal file
98
2018/src/day3.rs
Normal file
|
|
@ -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<Rectangle> {
|
||||||
|
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::<u32>().unwrap();
|
||||||
|
let y = tokens[2].parse::<u32>().unwrap();
|
||||||
|
let w = tokens[3].parse::<u32>().unwrap();
|
||||||
|
let h = tokens[4].parse::<u32>().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!")
|
||||||
|
}
|
||||||
|
|
@ -7,4 +7,6 @@ fn main() {
|
||||||
println!("Day 1 part 2: {}", day1::part2());
|
println!("Day 1 part 2: {}", day1::part2());
|
||||||
println!("Day 2 part 1: {}", day2::part1());
|
println!("Day 2 part 1: {}", day2::part1());
|
||||||
println!("Day 2 part 2: {}", day2::part2());
|
println!("Day 2 part 2: {}", day2::part2());
|
||||||
|
println!("Day 3 part 1: {}", day3::part1());
|
||||||
|
println!("Day 3 part 2: {}", day3::part2());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue