Day 11 cleanup

This commit is contained in:
kageru 2021-12-11 13:36:15 +01:00
parent c6b1ec262f
commit e668c96185
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
2 changed files with 37 additions and 46 deletions

10
2021/inputs/day11 Normal file
View File

@ -0,0 +1,10 @@
4743378318
4664212844
2535667884
3273363861
2282432612
2166612134
3776334513
8123852583
8181786685
4362533174

View File

@ -1,8 +1,6 @@
#![feature(bool_to_option)]
#![feature(test)]
extern crate test;
use std::time::Duration;
use aoc2021::{
common::*,
grid::{Grid, PositionND},
@ -18,61 +16,44 @@ fn parse_input(raw: &str) -> Parsed {
fn part1(parsed: &Parsed) -> usize {
let mut grid = parsed.to_owned();
let mut flashed = Vec::new();
let mut flashes = 0;
for _ in 0..ROUNDS {
for (p, energy) in grid.fields.iter_mut() {
*energy += 1;
if energy == &10 {
flashed.push(*p);
}
}
for p in flashed.clone() {
flash(&mut grid, p, &mut flashed);
}
flashes += flashed.len();
for p in flashed.drain(..) {
*grid.fields.get_mut(&p).unwrap() = 0;
}
}
flashes
(0..ROUNDS).map(|_| make_step(&mut grid)).sum()
}
fn flash(grid: &mut Parsed, position: PositionND<2>, flashed: &mut Vec<PositionND<2>>) {
fn part2(parsed: &Parsed) -> usize {
let mut grid = parsed.to_owned();
(0..).position(|_| make_step(&mut grid) == parsed.len()).unwrap() + 1
}
fn make_step(grid: &mut Parsed) -> usize {
let mut flashed: Vec<_> = grid
.fields
.iter_mut()
.filter_map(|(p, energy)| {
*energy += 1;
(*energy == 10).then_some(*p)
})
.collect();
for p in flashed.clone() {
flash(grid, &p, &mut flashed);
}
for p in &flashed {
*grid.fields.get_mut(p).unwrap() = 0;
}
flashed.len()
}
fn flash(grid: &mut Parsed, position: &PositionND<2>, flashed: &mut Vec<PositionND<2>>) {
for n in position.neighbors() {
if let Some(p) = grid.fields.get_mut(&n) {
*p += 1;
if p == &10 {
flashed.push(n);
flash(grid, n, flashed);
flash(grid, &n, flashed);
}
}
}
}
fn part2(parsed: &Parsed) -> usize {
let mut grid = parsed.to_owned();
let mut flashed = Vec::new();
for i in 1.. {
for (p, energy) in grid.fields.iter_mut() {
*energy += 1;
if energy == &10 {
flashed.push(*p);
}
}
for p in flashed.clone() {
flash(&mut grid, p, &mut flashed);
}
if flashed.len() == parsed.len() {
return i;
}
for p in flashed.drain(..) {
*grid.fields.get_mut(&p).unwrap() = 0;
}
}
unreachable!()
}
fn main() {
let input = parse_input(&read_file(DAY));
println!("Part 1: {}", part1(&input));