From cbbee06a642be48e34ea589f6c050f8a6865c5f7 Mon Sep 17 00:00:00 2001 From: Dominic Date: Wed, 13 Dec 2023 18:35:38 +0100 Subject: [PATCH] day 13 part 2 --- src/bin/day13.rs | 76 +++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/src/bin/day13.rs b/src/bin/day13.rs index 6f2a434..66b8d78 100644 --- a/src/bin/day13.rs +++ b/src/bin/day13.rs @@ -1,4 +1,3 @@ -// #![allow(clippy::never_loop)] #![forbid(elided_lifetimes_in_paths, unsafe_code)] use aoc23::read; @@ -43,51 +42,56 @@ fn parser() -> impl Parser, Error = Simple> { .then_ignore(end()) } -fn main() -> anyhow::Result<()> { - let patterns = read("inputs/day13.txt", parser())?; - +fn find_mirrors_in_patters(patterns: &[Pattern], diff: u32) -> usize { let mut rows = Vec::new(); let mut cols = Vec::new(); - for (pidx, Pattern { grid }) in patterns.iter().enumerate() { - eprintln!("Pattern {pidx}"); - 'i: for i in 1 .. grid.len() { - for j in 0 .. i.min(grid.len() - i) { - if grid[i - j - 1] != grid[i + j] { - // eprintln!("discarding cut {i} due to rows {}/{}", i - j - 1, i + j); - continue 'i; - } - } - println!("mirroring at row {i}"); - rows.push(i); - } - // println!("rows: {rows:?}"); - 'i: for i in 1 .. grid[0].len() { - for j in 0 .. i.min(grid[0].len() - i) { - for row in grid { - if row[i - j - 1] != row[i + j] { - // eprintln!( - // "discarding cut {i} due to cols {}/{}", - // i - j - 1, - // i + j - // ); - continue 'i; + for Pattern { grid } in patterns { + 'i: for i in 1 .. grid.len() { + let mut d = 0; + for j in 0 .. i.min(grid.len() - i) { + assert_eq!(grid[0].len(), grid[i - j - 1].len()); + assert_eq!(grid[0].len(), grid[i + j].len()); + for k in 0 .. grid[0].len() { + if grid[i - j - 1][k] != grid[i + j][k] { + d += 1; + if d > diff { + continue 'i; + } } } } - println!("mirroring at col {i}"); - cols.push(i); + if d == diff { + rows.push(i); + } } - // println!("cols: {cols:?}"); - // break; + 'i: for i in 1 .. grid[0].len() { + let mut d = 0; + for j in 0 .. i.min(grid[0].len() - i) { + for row in grid { + if row[i - j - 1] != row[i + j] { + d += 1; + if d > diff { + continue 'i; + } + } + } + } + if d == diff { + cols.push(i); + } + } } - // 20464 is too low - println!( - "{}", - rows.iter().sum::() * 100 + cols.iter().sum::() - ); + rows.iter().sum::() * 100 + cols.iter().sum::() +} + +fn main() -> anyhow::Result<()> { + let patterns = read("inputs/day13.txt", parser())?; + + println!("{}", find_mirrors_in_patters(&patterns, 0)); + println!("{}", find_mirrors_in_patters(&patterns, 1)); Ok(()) }