2022 rust day 15
This commit is contained in:
parent
3586380a4e
commit
aefcb85f11
|
@ -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| {
|
||||||
|
|
Loading…
Reference in a new issue