-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday_18.rs
93 lines (77 loc) · 2.35 KB
/
day_18.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use std::collections::HashSet;
pub fn run() {
let input_str = include_str!("../../inputs/input_18.txt");
let input: Vec<Vec<i32>> = input_str
.lines()
.map(|line| line.split(',').map(|num| num.parse().unwrap()).collect())
.collect();
part_one(&input);
part_two(&input);
}
fn part_one(input: &[Vec<i32>]) {
let mut count = 0;
for cube in input {
for i in 0..3 {
for j in &[-1, 1] {
let mut new_cube = cube.clone();
new_cube[i] += j;
if !input.contains(&new_cube) {
count += 1;
}
}
}
}
println!("Part one: {count}");
}
fn part_two(input: &[Vec<i32>]) {
let mut count = 0;
for cube in input {
for i in 0..3 {
for j in &[-1, 1] {
let mut adjacent_cube = cube.clone();
adjacent_cube[i] += j;
if !input.contains(&adjacent_cube) && !is_encased(&adjacent_cube, input) {
count += 1;
}
}
}
}
println!("Part two: {count}");
}
fn is_encased(cube: &[i32], map: &[Vec<i32>]) -> bool {
let mut cubes: Vec<Vec<i32>> = vec![];
cubes.push(cube.to_vec());
let mut checked_cubes: HashSet<Vec<i32>> = HashSet::new();
while !cubes.is_empty() {
let cube = cubes.pop().unwrap();
if !raycast(&cube, map) {
return false;
}
checked_cubes.insert(cube.clone());
for i in 0..3 {
for j in &[-1, 1] {
let mut adjacent_cube = cube.clone();
adjacent_cube[i] += j;
if !checked_cubes.contains(&adjacent_cube) && !map.contains(&adjacent_cube) && !cubes.contains(&adjacent_cube) {
cubes.push(adjacent_cube);
}
}
}
}
true
}
fn raycast(cube: &[i32], map: &[Vec<i32>]) -> bool {
for i in 0..3 {
if map.iter().filter(|lava|
lava[i] > cube[i] && lava[(i+1) % 3] == cube[(i+1) % 3] && lava[(i+2) % 3] == cube[(i+2) % 3]
).count() == 0 {
return false;
}
if map.iter().filter(|lava|
lava[i] < cube[i] && lava[(i+1) % 3] == cube[(i+1) % 3] && lava[(i+2) % 3] == cube[(i+2) % 3]
).count() == 0 {
return false;
}
}
true
}