@@ -19,22 +19,31 @@ fn parse(input: &str) -> Result<Vec<Vec<u32>>, AocError> {
1919 . collect ( )
2020}
2121
22- fn find_max_joltage ( banks : & [ u32 ] , digits : usize ) -> u64 {
22+ fn find_max_joltage ( banks : & [ u32 ] , digits : usize ) -> Option < u64 > {
23+ if digits > banks. len ( ) {
24+ return None ;
25+ }
26+
2327 let mut skip = 0 ;
2428 let mut result = 0 ;
2529
26- for digit in 0 ..digits {
27- let digit_pos = digits - digit - 1 ;
28- let take = banks. len ( ) - skip - digit_pos;
30+ for i in 0 ..digits {
31+ let remaining = digits - i;
32+ let end = banks. len ( ) - ( remaining - 1 ) ;
33+ let slice = & banks[ skip..end] ;
2934
30- let mut banks_to_check = banks. iter ( ) . skip ( skip) . take ( take) ;
31- let max = banks_to_check. clone ( ) . max ( ) . unwrap ( ) ;
35+ let ( offset, & max) = slice
36+ . iter ( )
37+ . enumerate ( )
38+ // max_by_key returns the last element
39+ . rev ( )
40+ . max_by_key ( |& ( _, v) | v) ?;
3241
33- skip += banks_to_check . position ( |battery| battery == max ) . unwrap ( ) + 1 ;
34- result += 10u64 . pow ( digit_pos as u32 ) * * max as u64
42+ skip += offset + 1 ;
43+ result = result * 10 + max as u64 ;
3544 }
3645
37- result
46+ Some ( result)
3847}
3948
4049impl Solution for Day03 {
@@ -48,7 +57,7 @@ impl Solution for Day03 {
4857 fn part_1 ( & self , input : & str ) -> Result < u64 , AocError > {
4958 let total = parse ( input) ?
5059 . iter ( )
51- . map ( |bank| find_max_joltage ( bank, 2 ) )
60+ . flat_map ( |bank| find_max_joltage ( bank, 2 ) )
5261 . sum ( ) ;
5362
5463 Ok ( total)
@@ -57,7 +66,7 @@ impl Solution for Day03 {
5766 fn part_2 ( & self , input : & str ) -> Result < u64 , AocError > {
5867 let total = parse ( input) ?
5968 . iter ( )
60- . map ( |bank| find_max_joltage ( bank, 12 ) )
69+ . flat_map ( |bank| find_max_joltage ( bank, 12 ) )
6170 . sum ( ) ;
6271
6372 Ok ( total)
@@ -72,63 +81,63 @@ mod tests {
7281 fn it_finds_max_joltage_1 ( ) {
7382 assert_eq ! (
7483 find_max_joltage( & [ 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] , 2 ) ,
75- 98
84+ Some ( 98 )
7685 ) ;
7786 }
7887
7988 #[ test]
8089 fn it_finds_max_joltage_2 ( ) {
8190 assert_eq ! (
8291 find_max_joltage( & [ 8 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 9 ] , 2 ) ,
83- 89
92+ Some ( 89 )
8493 )
8594 }
8695
8796 #[ test]
8897 fn it_finds_max_joltage_3 ( ) {
8998 assert_eq ! (
9099 find_max_joltage( & [ 2 , 3 , 4 , 2 , 3 , 4 , 2 , 3 , 4 , 2 , 3 , 4 , 2 , 7 , 8 ] , 2 ) ,
91- 78
100+ Some ( 78 )
92101 )
93102 }
94103
95104 #[ test]
96105 fn it_finds_max_joltage_4 ( ) {
97106 assert_eq ! (
98107 find_max_joltage( & [ 8 , 1 , 8 , 1 , 8 , 1 , 9 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 ] , 2 ) ,
99- 92
108+ Some ( 92 )
100109 )
101110 }
102111
103112 #[ test]
104113 fn it_finds_max_joltage_5 ( ) {
105114 assert_eq ! (
106115 find_max_joltage( & [ 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] , 12 ) ,
107- 987654321111
116+ Some ( 987654321111 )
108117 ) ;
109118 }
110119
111120 #[ test]
112121 fn it_finds_max_joltage_6 ( ) {
113122 assert_eq ! (
114123 find_max_joltage( & [ 8 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 9 ] , 12 ) ,
115- 811111111119
124+ Some ( 811111111119 )
116125 ) ;
117126 }
118127
119128 #[ test]
120129 fn it_finds_max_joltage_7 ( ) {
121130 assert_eq ! (
122131 find_max_joltage( & [ 2 , 3 , 4 , 2 , 3 , 4 , 2 , 3 , 4 , 2 , 3 , 4 , 2 , 7 , 8 ] , 12 ) ,
123- 434234234278
132+ Some ( 434234234278 )
124133 ) ;
125134 }
126135
127136 #[ test]
128137 fn it_finds_max_joltage_8 ( ) {
129138 assert_eq ! (
130139 find_max_joltage( & [ 8 , 1 , 8 , 1 , 8 , 1 , 9 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 ] , 12 ) ,
131- 888911112111
140+ Some ( 888911112111 )
132141 ) ;
133142 }
134143
0 commit comments