From 0c4430ad01b84a4f1e7d44c094830c279d651e61 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Wed, 13 Dec 2023 18:33:09 +0100 Subject: [PATCH] Implement 2023 day 13 part 2 --- 2023/src/day13.rs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/2023/src/day13.rs b/2023/src/day13.rs index 3fdd3a8..24aef9b 100644 --- a/2023/src/day13.rs +++ b/2023/src/day13.rs @@ -15,12 +15,16 @@ impl Symmetry { } } -fn find_symmetry(grid: Grid<'_>) -> Option { +fn find_symmetry(grid: Grid<'_>, differences: usize) -> Option { // Attempt to find a vertical line of reflection first for c in 1..grid.width() { if grid .rows() - .all(|row| row[..c].iter().rev().zip(&row[c..]).all(|(a, b)| a == b)) + .flat_map(|row| row[..c].iter().rev().zip(&row[c..])) + .filter(|(a, b)| a != b) + .take(differences + 1) + .count() + == differences { return Some(Symmetry::Vertical(c as u32)); } @@ -30,7 +34,11 @@ fn find_symmetry(grid: Grid<'_>) -> Option { if (0..r) .rev() .zip(r..grid.height()) - .all(|(a, b)| grid[a] == grid[b]) + .flat_map(|(a, b)| grid[a].iter().zip(&grid[b])) + .filter(|(a, b)| a != b) + .take(differences + 1) + .count() + == differences { return Some(Symmetry::Horizontal(r as u32)); } @@ -62,19 +70,23 @@ fn parse_grids(input: &[u8]) -> anyhow::Result>> { Ok(result) } -pub fn part1(input: &[u8]) -> anyhow::Result { +fn parts_common(input: &[u8], differences: usize) -> anyhow::Result { let grids = parse_grids(input)?; let sum: u32 = grids .into_iter() - .filter_map(find_symmetry) + .filter_map(|grid| find_symmetry(grid, differences)) .map(Symmetry::value) .sum(); Ok(sum.to_string()) } -pub fn part2(_input: &[u8]) -> anyhow::Result { - anyhow::bail!("Not implemented") +pub fn part1(input: &[u8]) -> anyhow::Result { + parts_common(input, 0) +} + +pub fn part2(input: &[u8]) -> anyhow::Result { + parts_common(input, 1) } #[cfg(test)] @@ -88,8 +100,8 @@ mod tests { assert_eq!("405", part1(SAMPLE).unwrap()); } - // #[test] - // fn sample_part2() { - // assert_eq!("525152", part2(SAMPLE).unwrap()); - // } + #[test] + fn sample_part2() { + assert_eq!("400", part2(SAMPLE).unwrap()); + } }