day4: add removal queue implementation for part2
This commit is contained in:
35
src/day4.rs
35
src/day4.rs
@@ -1,12 +1,13 @@
|
|||||||
use aoc_runner_derive::{aoc, aoc_generator};
|
use aoc_runner_derive::{aoc, aoc_generator};
|
||||||
use grid::Grid;
|
use grid::Grid;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
#[aoc_generator(day4)]
|
#[aoc_generator(day4)]
|
||||||
fn parse(input: &str) -> Grid<u8> {
|
fn parse(input: &str) -> Grid<u8> {
|
||||||
input.parse().unwrap()
|
input.parse().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[aoc(day4, part1)]
|
#[aoc(day4, part1, Brute)]
|
||||||
fn part1(input: &Grid<u8>) -> u64 {
|
fn part1(input: &Grid<u8>) -> u64 {
|
||||||
(0..input.height() * input.width())
|
(0..input.height() * input.width())
|
||||||
.filter(|i| *input.get(&input.coord(*i as i64).unwrap()).unwrap() == b'@')
|
.filter(|i| *input.get(&input.coord(*i as i64).unwrap()).unwrap() == b'@')
|
||||||
@@ -14,7 +15,8 @@ fn part1(input: &Grid<u8>) -> u64 {
|
|||||||
.filter(|n| *n < 4)
|
.filter(|n| *n < 4)
|
||||||
.count() as u64
|
.count() as u64
|
||||||
}
|
}
|
||||||
#[aoc(day4, part2)]
|
|
||||||
|
#[aoc(day4, part2, Brute)]
|
||||||
fn part2(input: &Grid<u8>) -> u64 {
|
fn part2(input: &Grid<u8>) -> u64 {
|
||||||
let mut grid = input.clone();
|
let mut grid = input.clone();
|
||||||
let mut removed = 0;
|
let mut removed = 0;
|
||||||
@@ -38,6 +40,30 @@ fn part2(input: &Grid<u8>) -> u64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[aoc(day4, part2, RollList)]
|
||||||
|
fn part2_list(input: &Grid<u8>) -> u64 {
|
||||||
|
let mut grid = input.clone();
|
||||||
|
let mut to_check = grid.find_all(&b'@').collect_vec();
|
||||||
|
let mut removed = 0;
|
||||||
|
|
||||||
|
while let Some(roll) = to_check.pop() {
|
||||||
|
if grid.get(&roll).is_none_or(|c| *c == b'.') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let adjacent_rolls = grid
|
||||||
|
.adjacent_iter(&roll)
|
||||||
|
.filter_map(|i| if *i.value == b'@' { Some(i.pos) } else { None })
|
||||||
|
.collect_vec();
|
||||||
|
if adjacent_rolls.len() < 4 {
|
||||||
|
grid.set(&roll, b'.');
|
||||||
|
removed += 1;
|
||||||
|
to_check.extend_from_slice(&adjacent_rolls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removed
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -62,4 +88,9 @@ mod tests {
|
|||||||
fn part2_example() {
|
fn part2_example() {
|
||||||
assert_eq!(part2(&parse(EXAMPLE)), 43);
|
assert_eq!(part2(&parse(EXAMPLE)), 43);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_list_example() {
|
||||||
|
assert_eq!(part2_list(&parse(EXAMPLE)), 43);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user