Skip to content

Commit 6d4c994

Browse files
committed
refactor: use functional style to repeatedly join ranges
1 parent 18a5f2b commit 6d4c994

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

day5/src/main.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
11
use std::ops::RangeInclusive;
22

33
use aoc_derive::aoc_main;
4-
use itertools::Itertools;
4+
use itertools::{FoldWhile, Itertools};
55
use utils::*;
66

7-
fn part2(mut ranges: Vec<RangeInclusive<usize>>) -> usize {
8-
ranges.sort_by_key(|r| *r.start());
9-
loop {
10-
let prev = ranges.len();
11-
let mut i = 0;
12-
while i < ranges.len() - 1 {
13-
if ranges[i].end() >= ranges[i + 1].start() {
14-
ranges[i] = *ranges[i].start()..=(*ranges[i + 1].end().max(ranges[i].end()));
15-
ranges.remove(i + 1);
16-
} else {
17-
i += 1;
18-
}
19-
}
7+
fn part2(ranges: &[RangeInclusive<usize>]) -> usize {
8+
std::iter::repeat(())
9+
.fold_while(
10+
ranges.iter().cloned().sorted_by_key(|r| *r.start()).collect_vec(),
11+
|mut ranges, _| {
12+
let prev = ranges.len();
13+
let mut i = 0;
14+
while i < ranges.len() - 1 {
15+
if ranges[i].end() >= ranges[i + 1].start() {
16+
ranges[i] =
17+
*ranges[i].start()..=(*ranges[i + 1].end().max(ranges[i].end()));
18+
ranges.remove(i + 1);
19+
} else {
20+
i += 1;
21+
}
22+
}
2023

21-
if ranges.len() == prev {
22-
return ranges.iter().map(|range| range.try_len().unwrap()).sum();
23-
}
24-
}
24+
if ranges.len() < prev {
25+
FoldWhile::Continue(ranges)
26+
} else {
27+
FoldWhile::Done(ranges)
28+
}
29+
},
30+
)
31+
.into_inner()
32+
.iter()
33+
.map(|range| range.try_len().unwrap())
34+
.sum()
2535
}
2636

2737
#[aoc_main]
@@ -36,7 +46,7 @@ fn solve(input: Input) -> impl Into<Solution> {
3646
.collect_vec();
3747
let ingredients = ingredients.lines().map(|line| line.parse::<usize>().unwrap()).collect_vec();
3848

39-
(ingredients.iter().filter(|i| ranges.iter().any(|r| r.contains(i))).count(), part2(ranges))
49+
(ingredients.iter().filter(|i| ranges.iter().any(|r| r.contains(i))).count(), part2(&ranges))
4050
}
4151

4252
#[cfg(test)]

0 commit comments

Comments
 (0)