2022 rust day 15

This commit is contained in:
Maciej Jur 2022-12-15 19:41:09 +01:00
parent 3586380a4e
commit aefcb85f11

View file

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