2022 day 18

This commit is contained in:
Maciej Jur 2022-12-18 14:28:54 +01:00
parent 644745623f
commit 6f32d6b292

View file

@ -1,3 +1,4 @@
#![allow(dead_code)]
use std::collections::HashSet;
use crate::utils;
@ -14,18 +15,16 @@ pub fn run() -> () {
type Point = (isize, isize, isize);
fn sides_for((x, y, z): Point) -> impl Iterator<Item=Point> {
[(x - 1, y, z), (x + 1, y, z), (x, y - 1, z), (x, y + 1, z), (x, y, z - 1), (x, y, z + 1)].into_iter()
}
fn solve1(data: &[Point]) -> i32 {
let points: HashSet<Point> = HashSet::from_iter(data.iter().copied());
let mut side_sum = 0;
for &(p_x, p_y, p_z) in data {
let sides = [
(p_x - 1, p_y, p_z), (p_x + 1, p_y, p_z),
(p_x, p_y - 1, p_z), (p_x, p_y + 1, p_z),
(p_x, p_y, p_z - 1), (p_x, p_y, p_z + 1),
];
for side in sides {
for &point in data {
for side in sides_for(point) {
if !points.contains(&side) {
side_sum += 1;
}
@ -35,7 +34,33 @@ fn solve1(data: &[Point]) -> i32 {
}
fn solve2(data: &[Point]) -> i32 {
2
let points: HashSet<Point> = HashSet::from_iter(data.iter().copied());
let (x_min, y_min, z_min) = data.iter().copied().reduce(|(x1, y1, z1), (x2, y2, z2)| (x1.min(x2), y1.min(y2), z1.min(z2))).unwrap();
let (x_max, y_max, z_max) = data.iter().copied().reduce(|(x1, y1, z1), (x2, y2, z2)| (x1.max(x2), y1.max(y2), z1.max(z2))).unwrap();
let (x_min, y_min, z_min) = (x_min - 1, y_min - 1, z_min - 1);
let (x_max, y_max, z_max) = (x_max + 1, y_max + 1, z_max + 1);
let fits = move |&(x, y, z): &Point| {
x_min <= x && x <= x_max && y_min <= y && y <= y_max && z_min <= z && z <= z_max
};
let mut to_check: Vec<Point> = vec![(x_min, y_min, z_min)];
let mut visited: HashSet<Point> = HashSet::new();
let mut side_sum = 0;
while let Some(current) = to_check.pop() {
match visited.contains(&current) {
true => continue,
false => visited.insert(current),
};
for neighbour in sides_for(current).filter(fits) {
match points.contains(&neighbour) {
true => side_sum += 1,
false => to_check.push(neighbour),
}
}
}
side_sum
}
@ -69,6 +94,6 @@ mod tests {
#[test]
fn part2() {
assert_eq!(2, solve2(&parse_data(DATA)));
assert_eq!(58, solve2(&parse_data(DATA)));
}
}