Skip to content

Commit 31aeae2

Browse files
committed
Use NonZero
1 parent 5f3a9c7 commit 31aeae2

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

src/day7.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1+
use std::num::NonZero;
2+
13
use 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

Comments
 (0)