summaryrefslogtreecommitdiffstats
path: root/src/bin/2021/day11.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/2021/day11.rs')
-rw-r--r--src/bin/2021/day11.rs82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/bin/2021/day11.rs b/src/bin/2021/day11.rs
new file mode 100644
index 0000000..fac392e
--- /dev/null
+++ b/src/bin/2021/day11.rs
@@ -0,0 +1,82 @@
+use advent_of_code::prelude::*;
+
+fn iterate(grid: &mut Grid<(u8, bool)>) -> usize {
+ let mut flashes = 0;
+ for (cell, _) in grid.cells_mut() {
+ *cell += 1;
+ }
+
+ loop {
+ let mut new_flashes = 0;
+ let mut updates: Grid<u8> = Grid::default();
+ updates.grow(grid.rows(), grid.cols());
+ for ((row, col), (cell, flashed)) in grid.indexed_cells_mut() {
+ if *flashed {
+ continue;
+ }
+ if *cell > 9 {
+ *flashed = true;
+ new_flashes += 1;
+ for (row, col) in updates.adjacent(row, col, true) {
+ updates[row][col] += 1;
+ }
+ }
+ }
+ if new_flashes > 0 {
+ flashes += new_flashes;
+ for ((row, col), val) in updates.indexed_cells() {
+ grid[row][col].0 += val;
+ }
+ } else {
+ break;
+ }
+ }
+
+ for (cell, flashed) in grid.cells_mut() {
+ if *flashed {
+ *cell = 0;
+ *flashed = false;
+ }
+ }
+
+ flashes
+}
+
+pub fn parse(fh: File) -> Result<Grid<(u8, bool)>> {
+ Ok(parse::digit_grid(parse::raw_lines(fh))
+ .indexed_cells()
+ .map(|((row, col), cell)| ((row, col), (*cell, false)))
+ .collect())
+}
+
+pub fn part1(mut map: Grid<(u8, bool)>) -> Result<usize> {
+ let mut flashes = 0;
+ for _ in 0..100 {
+ flashes += iterate(&mut map);
+ }
+ Ok(flashes)
+}
+
+pub fn part2(mut map: Grid<(u8, bool)>) -> Result<usize> {
+ let mut step = 1;
+ loop {
+ let flashes = iterate(&mut map);
+ if flashes == (map.rows().0 * map.cols().0) {
+ break;
+ }
+ step += 1;
+ }
+ Ok(step)
+}
+
+#[test]
+fn test() {
+ assert_eq!(
+ part1(parse(parse::data(2021, 11).unwrap()).unwrap()).unwrap(),
+ 1673
+ );
+ assert_eq!(
+ part2(parse(parse::data(2021, 11).unwrap()).unwrap()).unwrap(),
+ 279
+ );
+}