1+ use std:: num:: NonZero ;
2+
13use aoc_runner_derive:: aoc;
24
3- fn search ( target : u64 , v : & [ u64 ] ) -> bool {
5+ fn search ( target : u64 , v : & [ NonZero < u64 > ] ) -> bool {
46 match v {
57 [ ] => {
68 return target == 0 ;
79 }
810 [ rest @ .., last] => {
9- if target % * last == 0 {
10- if search ( target / * last, rest) {
11+ let last = last. get ( ) ;
12+ if target % last == 0 {
13+ if search ( target / last, rest) {
1114 return true ;
1215 }
1316 }
14- if * last > target {
17+ if last > target {
1518 return false ;
1619 }
17- return search ( target - * last, rest) ;
20+
21+ return search ( target - last, rest) ;
1822 }
1923 }
2024}
@@ -30,7 +34,7 @@ unsafe fn part1_inner(s: &str) -> u64 {
3034 let mut sum = 0 ;
3135
3236 let mut i = 0 ;
33- let mut v = [ 0 ; 15 ] ;
37+ let mut v = [ NonZero :: new ( 1 ) . unwrap ( ) ; 15 ] ;
3438 let mut v_len = 0 ;
3539
3640 while i < s. len ( ) {
@@ -48,7 +52,7 @@ unsafe fn part1_inner(s: &str) -> u64 {
4852 num += ( * s. get_unchecked ( i) - b'0' ) as u64 ;
4953 i += 1 ;
5054 if !s. get_unchecked ( i) . is_ascii_digit ( ) {
51- * v. get_unchecked_mut ( v_len) = num;
55+ * v. get_unchecked_mut ( v_len) = NonZero :: new_unchecked ( num) ;
5256 v_len += 1 ;
5357 num = 0 ;
5458 i += 1 ;
@@ -67,29 +71,30 @@ unsafe fn part1_inner(s: &str) -> u64 {
6771 sum
6872}
6973
70- fn search_part2 ( target : u64 , v : & [ u64 ] ) -> bool {
74+ fn search_part2 ( target : u64 , v : & [ NonZero < u64 > ] ) -> bool {
7175 match v {
7276 [ ] => {
7377 return target == 0 ;
7478 }
7579 [ rest @ .., last] => {
76- if target % * last == 0 {
77- if search_part2 ( target / * last, rest) {
80+ let last = last. get ( ) ;
81+ if target % last == 0 {
82+ if search_part2 ( target / last, rest) {
7883 return true ;
7984 }
8085 }
81- if * last > target {
86+ if last > target {
8287 return false ;
8388 }
8489
85- let size = 10u64 . pow ( last. ilog10 ( ) + 1 ) ;
86- if ( target - * last) % size == 0 {
87- if search_part2 ( ( target - * last) / size, rest) {
90+ let size = unsafe { NonZero :: new_unchecked ( 10u64 . pow ( last. ilog10 ( ) + 1 ) ) } ;
91+ if ( target - last) % size == 0 {
92+ if search_part2 ( ( target - last) / size, rest) {
8893 return true ;
8994 }
9095 }
9196
92- return search_part2 ( target - * last, rest) ;
97+ return search_part2 ( target - last, rest) ;
9398 }
9499 }
95100}
@@ -105,7 +110,7 @@ unsafe fn part2_inner(s: &str) -> u64 {
105110 let mut sum = 0 ;
106111
107112 let mut i = 0 ;
108- let mut v = [ 0 ; 15 ] ;
113+ let mut v = [ NonZero :: new ( 1 ) . unwrap ( ) ; 15 ] ;
109114 let mut v_len = 0 ;
110115
111116 while i < s. len ( ) {
@@ -123,7 +128,7 @@ unsafe fn part2_inner(s: &str) -> u64 {
123128 num += ( * s. get_unchecked ( i) - b'0' ) as u64 ;
124129 i += 1 ;
125130 if !s. get_unchecked ( i) . is_ascii_digit ( ) {
126- * v. get_unchecked_mut ( v_len) = num;
131+ * v. get_unchecked_mut ( v_len) = NonZero :: new_unchecked ( num) ;
127132 v_len += 1 ;
128133 num = 0 ;
129134 i += 1 ;
0 commit comments