day18
This commit is contained in:
2145
inputs/day18.txt
Normal file
2145
inputs/day18.txt
Normal file
File diff suppressed because it is too large
Load Diff
8
src/bin/day18_1.rs
Normal file
8
src/bin/day18_1.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
use std::fs;
|
||||||
|
|
||||||
|
use aoc2022::day18::process_part_1;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file = fs::read_to_string("./inputs/day18.txt").unwrap();
|
||||||
|
println!("{}", process_part_1(&file));
|
||||||
|
}
|
||||||
8
src/bin/day18_2.rs
Normal file
8
src/bin/day18_2.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
use std::fs;
|
||||||
|
|
||||||
|
use aoc2022::day18::process_part_2;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let file = fs::read_to_string("./inputs/day18.txt").unwrap();
|
||||||
|
println!("{}", process_part_2(&file));
|
||||||
|
}
|
||||||
102
src/day18.rs
Normal file
102
src/day18.rs
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
use nom::character::complete;
|
||||||
|
use nom::character::complete::newline;
|
||||||
|
use nom::combinator::opt;
|
||||||
|
use nom::multi::fold_many1;
|
||||||
|
use nom::sequence::{preceded, terminated, tuple};
|
||||||
|
use nom::IResult;
|
||||||
|
|
||||||
|
pub fn sides((x, y, z): (i32, i32, i32)) -> [(i32, i32, i32); 6] {
|
||||||
|
[
|
||||||
|
(x + 1, y, z),
|
||||||
|
(x - 1, y, z),
|
||||||
|
(x, y + 1, z),
|
||||||
|
(x, y - 1, z),
|
||||||
|
(x, y, z + 1),
|
||||||
|
(x, y, z - 1),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn process_part_1(input: &str) -> usize {
|
||||||
|
let drops = parse_input(input).unwrap().1;
|
||||||
|
|
||||||
|
drops
|
||||||
|
.iter()
|
||||||
|
.flat_map(|&v| sides(v))
|
||||||
|
.filter(|v| !drops.contains(v))
|
||||||
|
.count()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn process_part_2(input: &str) -> usize {
|
||||||
|
let drops = parse_input(input).unwrap().1;
|
||||||
|
// Flood fill Bounding box so we don't go too far out of sanity, its a dumb bounding box though
|
||||||
|
let max = drops.iter().flat_map(|&(x, y, z)| [x, y, z]).max().unwrap() + 1;
|
||||||
|
let mut seen = HashSet::new();
|
||||||
|
let mut stack = vec![(0, 0, 0)];
|
||||||
|
|
||||||
|
while let Some(pos) = stack.pop() {
|
||||||
|
for (x, y, z) in sides(pos) {
|
||||||
|
if !drops.contains(&(x, y, z))
|
||||||
|
&& !seen.contains(&(x, y, z))
|
||||||
|
&& [x, y, z].iter().all(|&i| -1 <= i && i <= max)
|
||||||
|
{
|
||||||
|
seen.insert((x, y, z));
|
||||||
|
stack.push((x, y, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drops
|
||||||
|
.iter()
|
||||||
|
.flat_map(|&v| sides(v))
|
||||||
|
.filter(|v| seen.contains(v))
|
||||||
|
.count()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(input: &str) -> IResult<&str, HashSet<(i32, i32, i32)>> {
|
||||||
|
fold_many1(parse_line, HashSet::new, |mut set, v| {
|
||||||
|
set.insert(v);
|
||||||
|
set
|
||||||
|
})(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_line(input: &str) -> IResult<&str, (i32, i32, i32)> {
|
||||||
|
terminated(
|
||||||
|
tuple((
|
||||||
|
complete::i32,
|
||||||
|
preceded(complete::char(','), complete::i32),
|
||||||
|
preceded(complete::char(','), complete::i32),
|
||||||
|
)),
|
||||||
|
opt(newline),
|
||||||
|
)(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const INPUT: &str = "2,2,2
|
||||||
|
1,2,2
|
||||||
|
3,2,2
|
||||||
|
2,1,2
|
||||||
|
2,3,2
|
||||||
|
2,2,1
|
||||||
|
2,2,3
|
||||||
|
2,2,4
|
||||||
|
2,2,6
|
||||||
|
1,2,5
|
||||||
|
3,2,5
|
||||||
|
2,1,5
|
||||||
|
2,3,5";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn day1() {
|
||||||
|
assert_eq!(process_part_1(INPUT), 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn day2() {
|
||||||
|
assert_eq!(process_part_2(INPUT), 58);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,3 +18,4 @@ pub mod day14;
|
|||||||
pub mod day15;
|
pub mod day15;
|
||||||
pub mod day16;
|
pub mod day16;
|
||||||
pub mod day17;
|
pub mod day17;
|
||||||
|
pub mod day18;
|
||||||
|
|||||||
Reference in New Issue
Block a user