From 8f3ac2aacd85f04b6fc10dc5b1b0e2f35da95edd Mon Sep 17 00:00:00 2001 From: Keenan Tims Date: Sun, 7 Dec 2025 00:10:29 -0800 Subject: [PATCH] day7: part2 + clippies --- .aoc_tiles/tiles/2025/07.png | Bin 0 -> 7190 bytes README.md | 5 ++- src/day7.rs | 61 +++++++++++++++++++++++++++-------- 3 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 .aoc_tiles/tiles/2025/07.png diff --git a/.aoc_tiles/tiles/2025/07.png b/.aoc_tiles/tiles/2025/07.png new file mode 100644 index 0000000000000000000000000000000000000000..3b103b6ef478cf26b0ea340bb286b1ef1e263b34 GIT binary patch literal 7190 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 05149de..7a45bf0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- 2025 - 12 ⭐ - Rust + 2025 - 14 ⭐ - Rust

@@ -20,4 +20,7 @@ + + + diff --git a/src/day7.rs b/src/day7.rs index f459c4b..c25fefd 100644 --- a/src/day7.rs +++ b/src/day7.rs @@ -1,26 +1,19 @@ -use std::collections::HashSet; -use std::str::FromStr; - use aoc_runner_derive::{aoc, aoc_generator}; use grid::{AsCoord2d, Grid}; +use itertools::Itertools; +use std::str::FromStr; #[aoc_generator(day7)] fn parse(input: &str) -> Grid { Grid::from_str(input).unwrap() } -// fn emit_beams(grid: &mut Grid, pos: impl AsCoord2d) -> u64 { - match grid.get(&pos) { + match grid.set(&pos, b'|') { None | Some(b'|') => 0, - Some(b'.') | Some(b'S') => { - grid.set(&pos, b'|'); - emit_beams(grid, &(pos.x(), pos.y() + 1)) - } + Some(b'.') | Some(b'S') => emit_beams(grid, (pos.x(), pos.y() + 1)), Some(b'^') => { - grid.set(&pos, b'|'); - 1 + emit_beams(grid, &(pos.x() - 1, pos.y())) - + emit_beams(grid, &(pos.x() + 1, pos.y())) + 1 + emit_beams(grid, (pos.x() - 1, pos.y())) + emit_beams(grid, (pos.x() + 1, pos.y())) } _ => panic!(), } @@ -34,13 +27,48 @@ fn part1(input: &Grid) -> u64 { #[aoc(day7, part2)] fn part2(input: &Grid) -> u64 { - 0 + let mut grid = Grid::same_shape(input, 0u64); + grid.set(&input.find(&b'S').unwrap(), 1); + + // Start row is already set up + for y in 1..grid.height() { + let row_above = grid.row_iter(y as i64 - 1).unwrap().cloned().collect_vec(); + // for each column with non-zero counts in the row above get its column index and count + for (x, n) in row_above.into_iter().enumerate().filter(|(_i, n)| *n > 0) { + match input.get(&(x, y)) { + None => panic!("How did we end up outside the grid?"), + // if our current position is a caret, add that count to our neighbours + Some(b'^') => { + grid.set(&(x - 1, y), grid.get(&(x - 1, y)).unwrap() + n); + grid.set(&(x + 1, y), grid.get(&(x + 1, y)).unwrap() + n); + } + // if our current position is a . add that count here + Some(b'.') => { + grid.set(&(x, y), grid.get(&(x, y)).unwrap() + n); + } + _ => panic!(), + } + } + } + + grid.row(grid.height() as i64 - 1) + .unwrap() + .iter() + .sum::() } #[cfg(test)] mod tests { use super::*; + const TRIVIAL_EXAMPLE: &str = "...S... +....... +...^... +..^.^.^ +...^.^. +....... +......."; + const EXAMPLE: &str = ".......S....... ............... .......^....... @@ -65,6 +93,11 @@ mod tests { #[test] fn part2_example() { - assert_eq!(part2(&parse(EXAMPLE)), 0); + assert_eq!(part2(&parse(EXAMPLE)), 40); + } + + #[test] + fn part2_trivial_example() { + assert_eq!(part2(&parse(TRIVIAL_EXAMPLE)), 7); } }