diff options
Diffstat (limited to 'src/bin/2021/day15.rs')
-rw-r--r-- | src/bin/2021/day15.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/bin/2021/day15.rs b/src/bin/2021/day15.rs new file mode 100644 index 0000000..ca7a72f --- /dev/null +++ b/src/bin/2021/day15.rs @@ -0,0 +1,68 @@ +use advent_of_code::prelude::*; + +pub struct Map { + grid: Grid<u8>, +} + +impl advent_of_code::graph::Graph<(Row, Col), (Row, Col)> for Map { + type Edges = advent_of_code::grid::Adjacent; + + fn edges(&self, v: (Row, Col)) -> Self::Edges { + self.grid.adjacent(v.0, v.1, false) + } + + fn edge(&self, _v: (Row, Col), e: (Row, Col)) -> ((Row, Col), u64) { + (e, u64::from(self.grid[e.0][e.1])) + } +} + +pub fn parse(fh: File) -> Result<Map> { + Ok(Map { + grid: parse::digit_grid(parse::raw_lines(fh)), + }) +} + +pub fn part1(map: Map) -> Result<u64> { + Ok(map + .dijkstra( + (Row(0), Col(0)), + (map.grid.rows() - 1, map.grid.cols() - 1), + ) + .0) +} + +pub fn part2(map: Map) -> Result<u64> { + let mut large_grid = Grid::default(); + large_grid.grow(Row(map.grid.rows().0 * 5), Col(map.grid.cols().0 * 5)); + for lrow in 0..5 { + for lcol in 0..5 { + for ((Row(row), Col(col)), val) in map.grid.indexed_cells() { + let mut val = val + lrow + lcol; + while val > 9 { + val -= 9; + } + large_grid[Row(usize::from(lrow) * map.grid.rows().0 + row)] + [Col(usize::from(lcol) * map.grid.cols().0 + col)] = val; + } + } + } + let large_map = Map { grid: large_grid }; + Ok(large_map + .dijkstra( + (Row(0), Col(0)), + (large_map.grid.rows() - 1, large_map.grid.cols() - 1), + ) + .0) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2021, 15).unwrap()).unwrap()).unwrap(), + 441 + ); + assert_eq!( + part2(parse(parse::data(2021, 15).unwrap()).unwrap()).unwrap(), + 2849 + ); +} |