AoC2021/src/bin/day11.rs

86 lines
2.1 KiB
Rust

use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead};
use std::vec::Vec;
fn flash(x: i32, y: i32, grid: &mut Vec<Vec<u32>>) {
for dy in [-1, 0, 1] {
for dx in [-1, 0, 1] {
if dx == 0 && dy == 0 {
continue;
}
let ax = x + dx;
let ay = y + dy;
if ay < 0 || ay as usize >= grid.len() {
continue;
}
if ax < 0 || ax as usize >= grid[ay as usize].len() {
continue;
}
if grid[ay as usize][ax as usize] > 0 {
grid[ay as usize][ax as usize] += 1;
}
}
}
grid[y as usize][x as usize] = 0;
}
fn print_grid(grid: &Vec<Vec<u32>>) {
for y in 0..grid.len() {
for x in 0..grid[y].len() {
print!("{}", grid[y][x]);
}
println!("");
}
println!();
}
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day11.txt")?;
let mut grid: Vec<Vec<u32>> = io::BufReader::new(file)
.lines()
.map(|l| {
l.unwrap()
.chars()
.map(|c| c.to_digit(10).unwrap())
.collect()
})
.collect();
let mut answer1 = 0;
let mut step = 0;
while grid.iter().any(|r| r.iter().any(|e| e > &0)) {
let mut next_grid: Vec<Vec<u32>> = grid
.iter()
.map(|r| r.iter().map(|e| e + 1).collect())
.collect();
while next_grid.iter().any(|r| r.iter().any(|e| e > &9)) {
for y in 0..next_grid.len() {
for x in 0..next_grid[y].len() {
if next_grid[y][x] > 9 {
flash(x as i32, y as i32, &mut next_grid);
if step < 100 {
answer1 += 1;
}
}
}
}
}
grid = next_grid;
step += 1;
println!("Step {}", step);
print_grid(&grid);
}
println!("Answer1: {}", answer1);
println!("Answer2: {}", step);
Ok(())
}