Day 11 cleanup
This commit is contained in:
parent
c6b1ec262f
commit
e668c96185
|
@ -0,0 +1,10 @@
|
||||||
|
4743378318
|
||||||
|
4664212844
|
||||||
|
2535667884
|
||||||
|
3273363861
|
||||||
|
2282432612
|
||||||
|
2166612134
|
||||||
|
3776334513
|
||||||
|
8123852583
|
||||||
|
8181786685
|
||||||
|
4362533174
|
|
@ -1,8 +1,6 @@
|
||||||
|
#![feature(bool_to_option)]
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
use aoc2021::{
|
use aoc2021::{
|
||||||
common::*,
|
common::*,
|
||||||
grid::{Grid, PositionND},
|
grid::{Grid, PositionND},
|
||||||
|
@ -18,61 +16,44 @@ fn parse_input(raw: &str) -> Parsed {
|
||||||
|
|
||||||
fn part1(parsed: &Parsed) -> usize {
|
fn part1(parsed: &Parsed) -> usize {
|
||||||
let mut grid = parsed.to_owned();
|
let mut grid = parsed.to_owned();
|
||||||
let mut flashed = Vec::new();
|
(0..ROUNDS).map(|_| make_step(&mut grid)).sum()
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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() {
|
for n in position.neighbors() {
|
||||||
if let Some(p) = grid.fields.get_mut(&n) {
|
if let Some(p) = grid.fields.get_mut(&n) {
|
||||||
*p += 1;
|
*p += 1;
|
||||||
if p == &10 {
|
if p == &10 {
|
||||||
flashed.push(n);
|
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() {
|
fn main() {
|
||||||
let input = parse_input(&read_file(DAY));
|
let input = parse_input(&read_file(DAY));
|
||||||
println!("Part 1: {}", part1(&input));
|
println!("Part 1: {}", part1(&input));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user