Skip to content

Commit e4483cc

Browse files
committed
refactor: use a single fold instead of two loops
1 parent 6d4c994 commit e4483cc

File tree

1 file changed

+13
-27
lines changed

1 file changed

+13
-27
lines changed

day5/src/main.rs

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

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

77
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-
}
23-
24-
if ranges.len() < prev {
25-
FoldWhile::Continue(ranges)
26-
} else {
27-
FoldWhile::Done(ranges)
28-
}
29-
},
30-
)
31-
.into_inner()
8+
let ranges = ranges.iter().cloned().sorted_by_key(|r| *r.start()).collect_vec();
9+
ranges
3210
.iter()
33-
.map(|range| range.try_len().unwrap())
34-
.sum()
11+
// Add an empty range at the end to make sure we add the last one to the counter
12+
.chain(std::iter::once(&(usize::MAX..=usize::MAX)))
13+
.fold((0, ranges.first().unwrap().clone()), |(count, curr), next| {
14+
if next.start() <= curr.end() {
15+
(count, *curr.start()..=*curr.end().max(next.end()))
16+
} else {
17+
(count + curr.try_len().unwrap(), next.clone())
18+
}
19+
})
20+
.0
3521
}
3622

3723
#[aoc_main]

0 commit comments

Comments
 (0)