diff --git a/2022/rust/src/solutions/day15.rs b/2022/rust/src/solutions/day15.rs index 0c2a8d8..2265fef 100644 --- a/2022/rust/src/solutions/day15.rs +++ b/2022/rust/src/solutions/day15.rs @@ -1,3 +1,4 @@ +#![allow(dead_code)] use std::collections::{HashMap, HashSet}; use std::ops::RangeInclusive; use regex::{CaptureMatches, Regex}; @@ -41,8 +42,14 @@ fn range_for_row((r, c): (isize, isize), range: usize, row: isize) -> Option) -> Vec { - let mut ranges = ranges.clone(); +fn ranges_for_row(ranges: &HashMap<(isize, isize), usize>, row: isize) -> impl Iterator + '_ { + ranges.iter() + .filter_map(move |(&point, &range)| + range_for_row(point, range, row) + ) +} + +fn merge_ranges(mut ranges: Vec) -> Vec { ranges.sort_by(|r1, r2| r1.start().cmp(&r2.start())); let mut ranges = ranges.into_iter(); ranges.next() @@ -71,11 +78,7 @@ fn solve1(data: &Data) -> usize { acc }); - let ranges = ranges.iter() - .filter_map(|(&point, &range)| range_for_row(point, range, ROW)) - .collect::>(); - - let sum = merge_ranges(&ranges) + let sum = merge_ranges(ranges_for_row(&ranges, ROW).collect()) .iter() .map(|range| (*range.end() - *range.start() + 1) as usize) .sum::(); @@ -83,16 +86,17 @@ fn solve1(data: &Data) -> usize { sum - occupied.len() } -fn solve2(data: &Data) -> isize { +fn solve2(data: &Data) -> isize { let ranges = find_ranges(data); - let accepted_cols = 0..=SPACE; + let accepted_cols = 0..=SEARCH_SPACE; - (0..SPACE).into_iter() + (0..SEARCH_SPACE).into_iter() .flat_map(|cur_row| { - let ranges = ranges.iter() - .filter_map(|(&point, &range)| range_for_row(point, range, cur_row)) - .collect::>(); - let mut ranges = merge_ranges(&ranges).into_iter(); + let ranges = ranges_for_row(&ranges, cur_row) + .filter(|range| 0 <= *range.end() || *range.end() <= SEARCH_SPACE) + .collect(); + + let mut ranges = merge_ranges(ranges).into_iter(); let spots = ranges.next() .map(|first| ranges .fold((vec![], first), |(mut acc, prev), next| {