11use std:: ops:: RangeInclusive ;
22
33use aoc_derive:: aoc_main;
4- use itertools:: Itertools ;
4+ use itertools:: { FoldWhile , Itertools } ;
55use 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