2022 rust day 14
This commit is contained in:
parent
31c609954e
commit
edc4447c7c
|
@ -28,13 +28,15 @@ impl Display for Tile {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_grid(data: &[Vec<(usize, usize)>]) -> Matrix<Tile> {
|
fn get_data_bounds(data: &[Vec<(usize, usize)>]) -> (usize, (usize, usize)) {
|
||||||
let (min_c, max) = data.iter()
|
data.iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
.fold((usize::MAX, (usize::MIN, usize::MIN)), |(min_c, (max_r, max_c)), &(r, c)| (
|
.fold((usize::MAX, (usize::MIN, usize::MIN)), |(min_c, (max_r, max_c)), &(r, c)| (
|
||||||
min_c.min(c), (max_r.max(r), max_c.max(c))
|
min_c.min(c), (max_r.max(r), max_c.max(c))
|
||||||
));
|
))
|
||||||
let mut grid = Matrix::with_bounds((0, min_c), max, Tile::Empty);
|
}
|
||||||
|
|
||||||
|
fn fill_grid_walls(data: &[Vec<(usize, usize)>], grid: &mut Matrix<Tile>) {
|
||||||
for path in data.iter() {
|
for path in data.iter() {
|
||||||
let mut path_iter = path.iter();
|
let mut path_iter = path.iter();
|
||||||
path_iter.next()
|
path_iter.next()
|
||||||
|
@ -52,12 +54,15 @@ fn create_grid(data: &[Vec<(usize, usize)>]) -> Matrix<Tile> {
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
};
|
}
|
||||||
grid
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn drop_sand(grid: &mut Matrix<Tile>, (row, col): (usize, usize)) -> Option<(usize, usize)> {
|
fn drop_sand(grid: &mut Matrix<Tile>, (row, col): (usize, usize)) -> Option<(usize, usize)> {
|
||||||
|
if grid[(row, col)] != Tile::Empty {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let ((_, min_c), (max_r, max_c)) = grid.bounds();
|
let ((_, min_c), (max_r, max_c)) = grid.bounds();
|
||||||
for r in row..max_r {
|
for r in row..max_r {
|
||||||
if grid[(r, col)] != Tile::Empty {
|
if grid[(r, col)] != Tile::Empty {
|
||||||
|
@ -81,7 +86,9 @@ fn drop_sand(grid: &mut Matrix<Tile>, (row, col): (usize, usize)) -> Option<(usi
|
||||||
|
|
||||||
|
|
||||||
fn solve1(data: &[Vec<(usize, usize)>]) -> i32 {
|
fn solve1(data: &[Vec<(usize, usize)>]) -> i32 {
|
||||||
let mut grid = create_grid(data);
|
let (min_c, max) = get_data_bounds(data);
|
||||||
|
let mut grid = Matrix::with_bounds((0, min_c), max, Tile::Empty);
|
||||||
|
fill_grid_walls(data, &mut grid);
|
||||||
|
|
||||||
let mut sand_count = 0;
|
let mut sand_count = 0;
|
||||||
while let Some(_) = drop_sand(&mut grid, (0, 500)) {
|
while let Some(_) = drop_sand(&mut grid, (0, 500)) {
|
||||||
|
@ -92,7 +99,23 @@ fn solve1(data: &[Vec<(usize, usize)>]) -> i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn solve2(data: &[Vec<(usize, usize)>]) -> i32 {
|
fn solve2(data: &[Vec<(usize, usize)>]) -> i32 {
|
||||||
2
|
let (min_c, (max_r, max_c)) = get_data_bounds(data);
|
||||||
|
let new_max_r = max_r + 2;
|
||||||
|
let new_min_c = min_c - (max_r + 2);
|
||||||
|
let new_max_c = max_c + (max_r + 2);
|
||||||
|
let mut grid = Matrix::with_bounds((0, new_min_c), (new_max_r, new_max_c), Tile::Empty);
|
||||||
|
fill_grid_walls(data, &mut grid);
|
||||||
|
|
||||||
|
for c in new_min_c..=new_max_c {
|
||||||
|
grid[(new_max_r, c)] = Tile::Rock;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut sand_count = 0;
|
||||||
|
while let Some(_) = drop_sand(&mut grid, (0, 500)) {
|
||||||
|
sand_count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sand_count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -129,7 +152,6 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn part2() {
|
fn part2() {
|
||||||
let data = parse_data(DATA);
|
assert_eq!(93, solve2(&parse_data(DATA)));
|
||||||
assert_eq!(2, solve2(&data));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue