diff --git a/aoc2025/benches/aoc2025_bench.rs b/aoc2025/benches/aoc2025_bench.rs index 4cbc578..8dc0547 100644 --- a/aoc2025/benches/aoc2025_bench.rs +++ b/aoc2025/benches/aoc2025_bench.rs @@ -3,11 +3,13 @@ use criterion::{criterion_group, criterion_main, Criterion}; use aoc2025::day01; use aoc2025::day02; use aoc2025::day03; +use aoc2025::day04; fn aoc2025_all(c: &mut Criterion) { c.bench_function("day01", |b| b.iter(|| day01::run().unwrap())); c.bench_function("day02", |b| b.iter(|| day02::run().unwrap())); c.bench_function("day03", |b| b.iter(|| day03::run().unwrap())); + c.bench_function("day04", |b| b.iter(|| day04::run().unwrap())); } criterion_group! { diff --git a/aoc2025/src/day04.rs b/aoc2025/src/day04.rs index d91a1ea..7761cf3 100644 --- a/aoc2025/src/day04.rs +++ b/aoc2025/src/day04.rs @@ -7,6 +7,7 @@ const INPUT: &str = include_str!("../input/day04.txt"); pub fn run() -> Result { let mut res = String::with_capacity(128); writeln!(res, "part 1: {}", part1(INPUT)?)?; + writeln!(res, "part 2: {}", part2(INPUT)?)?; Ok(res) } @@ -84,6 +85,30 @@ impl PaperRollsMap { } count <= 4 } + + fn count_removable_rolls(&mut self) -> usize { + let mut count = 0; + loop { + let mut cur_loop_count = 0; + let mut copy = PaperRollsMap(self.0.clone()); + for y in 0..self.len() { + for x in 0..self.width() { + if self.0[y][x] && self.roll_is_accessible(x, y) { + copy.0[y][x] = false; + cur_loop_count += 1; + } + } + } + + if cur_loop_count == 0 { + break; + } + + *self = copy; + count += cur_loop_count; + } + count + } } fn part1(input: &str) -> Result { @@ -92,6 +117,12 @@ fn part1(input: &str) -> Result { Ok(grid.count_accessible_rolls()) } +fn part2(input: &str) -> Result { + let mut grid: PaperRollsMap = input.parse()?; + + Ok(grid.count_removable_rolls()) +} + #[cfg(test)] mod tests { use super::*; @@ -108,13 +139,13 @@ mod tests { assert_eq!(part1(INPUT).unwrap(), 1393); } - //#[test] - //fn part2_provided() { - // assert_eq!(part2(PROVIDED).unwrap(), 3121910778619); - //} + #[test] + fn part2_provided() { + assert_eq!(part2(PROVIDED).unwrap(), 43); + } - //#[test] - //fn part2_real() { - // assert_eq!(part2(INPUT).unwrap(), 168798209663590); - //} + #[test] + fn part2_real() { + assert_eq!(part2(INPUT).unwrap(), 8643); + } }