File tree 3 files changed +37
-29
lines changed
3 files changed +37
-29
lines changed Original file line number Diff line number Diff line change 1
- use adventutil:: maxtracker:: FirstMaxKeyTracker ;
2
1
use adventutil:: pullparser:: { ParseError , PullParser , Token } ;
3
2
use adventutil:: Input ;
4
3
@@ -7,11 +6,16 @@ struct Banks(Vec<u32>);
7
6
8
7
impl Banks {
9
8
fn maxpos ( & self ) -> usize {
10
- let mut tracker = FirstMaxKeyTracker :: new ( ) ;
11
- for ( i, & val) in self . 0 . iter ( ) . enumerate ( ) {
12
- tracker. add ( i, val) ;
13
- }
14
- tracker. get_key ( ) . unwrap ( )
9
+ self . 0
10
+ . iter ( )
11
+ . copied ( )
12
+ . enumerate ( )
13
+ // Use rev() so that max_by_key() will return the first max element
14
+ // in self.0 when there's a tie.
15
+ . rev ( )
16
+ . max_by_key ( |& ( _, val) | val)
17
+ . unwrap ( )
18
+ . 0
15
19
}
16
20
17
21
fn redistribute ( & mut self ) {
Original file line number Diff line number Diff line change 1
- use adventutil:: maxtracker:: FirstMaxKeyTracker ;
2
1
use adventutil:: pullparser:: { ParseError , PullParser , Token } ;
3
2
use adventutil:: Input ;
4
3
@@ -7,11 +6,16 @@ struct Banks(Vec<u32>);
7
6
8
7
impl Banks {
9
8
fn maxpos ( & self ) -> usize {
10
- let mut tracker = FirstMaxKeyTracker :: new ( ) ;
11
- for ( i, & val) in self . 0 . iter ( ) . enumerate ( ) {
12
- tracker. add ( i, val) ;
13
- }
14
- tracker. get_key ( ) . unwrap ( )
9
+ self . 0
10
+ . iter ( )
11
+ . copied ( )
12
+ . enumerate ( )
13
+ // Use rev() so that max_by_key() will return the first max element
14
+ // in self.0 when there's a tie.
15
+ . rev ( )
16
+ . max_by_key ( |& ( _, val) | val)
17
+ . unwrap ( )
18
+ . 0
15
19
}
16
20
17
21
fn redistribute ( & mut self ) {
Original file line number Diff line number Diff line change 1
- use adventutil:: maxtracker:: MinTracker ;
2
1
use adventutil:: Input ;
3
2
4
3
/// A doubly-linked list backed by a borrowed slice, with adjacency of elements
@@ -169,23 +168,24 @@ struct Adjacent {
169
168
170
169
fn solve ( s : & str ) -> usize {
171
170
let mut list = DoubleIndexList :: new ( s. as_bytes ( ) ) ;
172
- let mut shortest = MinTracker :: new ( ) ;
173
- for & c in b"abcdefghijklmnopqrstuvwxyz" {
174
- if c > b'a' {
175
- list. reset ( ) ;
176
- }
177
- let mut cursor = list. cursor ( ) ;
178
- while let Some ( & sc) = cursor. current ( ) {
179
- if sc. to_ascii_lowercase ( ) == c {
180
- cursor. remove_current ( ) ;
181
- } else {
182
- cursor. move_next ( ) ;
171
+ b"abcdefghijklmnopqrstuvwxyz"
172
+ . iter ( )
173
+ . map ( |& c| {
174
+ if c > b'a' {
175
+ list. reset ( ) ;
183
176
}
184
- }
185
- let length = react ( & mut list) ;
186
- shortest. add ( length) ;
187
- }
188
- shortest. get ( ) . unwrap ( )
177
+ let mut cursor = list. cursor ( ) ;
178
+ while let Some ( & sc) = cursor. current ( ) {
179
+ if sc. to_ascii_lowercase ( ) == c {
180
+ cursor. remove_current ( ) ;
181
+ } else {
182
+ cursor. move_next ( ) ;
183
+ }
184
+ }
185
+ react ( & mut list)
186
+ } )
187
+ . min ( )
188
+ . unwrap ( )
189
189
}
190
190
191
191
fn react ( chars : & mut DoubleIndexList < ' _ , u8 > ) -> usize {
You can’t perform that action at this time.
0 commit comments