generated from janezicmatej/aoc-template
solution: day 18
This commit is contained in:
parent
00000230cf
commit
00000240fc
|
@ -0,0 +1,25 @@
|
||||||
|
5,4
|
||||||
|
4,2
|
||||||
|
4,5
|
||||||
|
3,0
|
||||||
|
2,1
|
||||||
|
6,3
|
||||||
|
2,4
|
||||||
|
1,5
|
||||||
|
0,6
|
||||||
|
3,3
|
||||||
|
2,6
|
||||||
|
5,1
|
||||||
|
1,2
|
||||||
|
5,5
|
||||||
|
2,5
|
||||||
|
6,5
|
||||||
|
1,4
|
||||||
|
0,4
|
||||||
|
6,4
|
||||||
|
1,1
|
||||||
|
6,1
|
||||||
|
1,0
|
||||||
|
0,5
|
||||||
|
1,6
|
||||||
|
2,0
|
|
@ -0,0 +1,94 @@
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
use hashbrown::{HashMap, HashSet};
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
use aoc::{
|
||||||
|
grid_vec::{Direction, Point},
|
||||||
|
pnt,
|
||||||
|
};
|
||||||
|
|
||||||
|
fn parse_input(input: &str) -> Vec<Point> {
|
||||||
|
input
|
||||||
|
.lines()
|
||||||
|
.map(|x| {
|
||||||
|
x.split(',')
|
||||||
|
.filter_map(|y| y.parse().ok())
|
||||||
|
.collect_tuple()
|
||||||
|
.unwrap()
|
||||||
|
})
|
||||||
|
.map(|x: (usize, usize)| Point { i: x.1, j: x.0 })
|
||||||
|
.collect_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bfs(
|
||||||
|
visited: &mut HashMap<Point, usize>,
|
||||||
|
queue: &mut VecDeque<(Point, usize)>,
|
||||||
|
corruption: &HashSet<Point>,
|
||||||
|
end: Point,
|
||||||
|
) -> Option<usize> {
|
||||||
|
visited.clear();
|
||||||
|
queue.clear();
|
||||||
|
|
||||||
|
queue.push_back((pnt!(0, 0), 0));
|
||||||
|
|
||||||
|
while let Some((p, l)) = queue.pop_front() {
|
||||||
|
if visited.contains_key(&p) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
visited.insert(p, l);
|
||||||
|
|
||||||
|
if p == end {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for d in Direction::CROSS {
|
||||||
|
let n = p + d;
|
||||||
|
|
||||||
|
let in_bounds = n.bounded_by(&end);
|
||||||
|
let not_visited = !visited.contains_key(&n);
|
||||||
|
let not_corrupted = !corruption.contains(&n);
|
||||||
|
|
||||||
|
if in_bounds && not_visited && not_corrupted {
|
||||||
|
queue.push_back((n, l + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
visited.get(&end).copied()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<usize> {
|
||||||
|
let falling_bytes = parse_input(input);
|
||||||
|
|
||||||
|
let mut visited = HashMap::new();
|
||||||
|
let mut queue = VecDeque::new();
|
||||||
|
|
||||||
|
let end = pnt!(70, 70);
|
||||||
|
let corruption = HashSet::from_iter(falling_bytes.iter().copied().take(1024));
|
||||||
|
|
||||||
|
bfs(&mut visited, &mut queue, &corruption, end)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<String> {
|
||||||
|
let falling_bytes = parse_input(input);
|
||||||
|
|
||||||
|
let mut visited = HashMap::new();
|
||||||
|
let mut queue = VecDeque::new();
|
||||||
|
|
||||||
|
let end = pnt!(70, 70);
|
||||||
|
let mut corruption = HashSet::new();
|
||||||
|
let mut c = 0;
|
||||||
|
|
||||||
|
while bfs(&mut visited, &mut queue, &corruption, end).is_some() {
|
||||||
|
corruption.insert(falling_bytes[c]);
|
||||||
|
c += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let fb = falling_bytes[c - 1];
|
||||||
|
|
||||||
|
Some(format!("{},{}", fb.j, fb.i))
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(18);
|
||||||
|
|
Loading…
Reference in New Issue