Skip to content

Commit cac88aa

Browse files
committed
Better unroled solution?
1 parent bf18292 commit cac88aa

File tree

1 file changed

+44
-48
lines changed

1 file changed

+44
-48
lines changed

src/day7.rs

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,40 @@ use std::{hint::unreachable_unchecked, mem::MaybeUninit, num::NonZero};
33
use aoc_runner_derive::aoc;
44

55
macro_rules! search_fn {
6-
($name:ident => $name_next:ident) => {
6+
($name:ident($a1:ident, $($a:ident),*) => $name_next:ident) => {
77
#[inline(always)]
8-
unsafe fn $name(target: u64, v: &[NonZero<u64>]) -> bool {
9-
match v {
10-
[] => unsafe { unreachable_unchecked() },
11-
[rest @ .., last] => {
12-
let last = last.get();
13-
if last > target {
14-
return false;
15-
}
16-
17-
if target % last == 0 {
18-
if $name_next(target / last, rest) {
19-
return true;
20-
}
21-
}
22-
23-
return $name_next(target - last, rest);
8+
unsafe fn $name(target: u64, $($a: NonZero<u64>,)* $a1: NonZero<u64>) -> bool {
9+
let last = $a1.get();
10+
if last > target {
11+
return false;
12+
}
13+
14+
if target % last == 0 {
15+
if $name_next(target / last, $($a),*) {
16+
return true;
2417
}
2518
}
19+
20+
return $name_next(target - last, $($a),*);
2621
}
2722
};
2823
}
2924

30-
search_fn!(search_12 => search_11);
31-
search_fn!(search_11 => search_10);
32-
search_fn!(search_10 => search_9);
33-
search_fn!(search_9 => search_8);
34-
search_fn!(search_8 => search_7);
35-
search_fn!(search_7 => search_6);
36-
search_fn!(search_6 => search_5);
37-
search_fn!(search_5 => search_4);
38-
search_fn!(search_4 => search_3);
39-
search_fn!(search_3 => search_2);
40-
search_fn!(search_2 => search_1);
25+
search_fn!(search_12(a,b,c,d,e,f,g,h,i,j,k,l) => search_11);
26+
search_fn!(search_11(a,b,c,d,e,f,g,h,i,j,k) => search_10);
27+
search_fn!(search_10(a,b,c,d,e,f,g,h,i,j) => search_9);
28+
search_fn!(search_9(a,b,c,d,e,f,g,h,i) => search_8);
29+
search_fn!(search_8(a,b,c,d,e,f,g,h) => search_7);
30+
search_fn!(search_7(a,b,c,d,e,f,g) => search_6);
31+
search_fn!(search_6(a,b,c,d,e,f) => search_5);
32+
search_fn!(search_5(a,b,c,d,e) => search_4);
33+
search_fn!(search_4(a,b,c,d) => search_3);
34+
search_fn!(search_3(a,b,c) => search_2);
35+
search_fn!(search_2(a,b) => search_1);
4136

4237
#[inline(always)]
43-
unsafe fn search_1(target: u64, v: &[NonZero<u64>]) -> bool {
44-
match v {
45-
[last] => {
46-
return target == last.get();
47-
}
48-
_ => unsafe { unreachable_unchecked() },
49-
}
38+
fn search_1(target: u64, last: NonZero<u64>) -> bool {
39+
return target == last.get();
5040
}
5141

5242
#[aoc(day7, part1)]
@@ -91,19 +81,25 @@ unsafe fn part1_inner(s: &str) -> u64 {
9181

9282
let init = &*(v.get_unchecked(..v_len) as *const [MaybeUninit<NonZero<u64>>]
9383
as *const [NonZero<u64>]);
94-
if match init.len() {
95-
1 => search_1(target, init),
96-
2 => search_2(target, init),
97-
3 => search_3(target, init),
98-
4 => search_4(target, init),
99-
5 => search_5(target, init),
100-
6 => search_6(target, init),
101-
7 => search_7(target, init),
102-
8 => search_8(target, init),
103-
9 => search_9(target, init),
104-
10 => search_10(target, init),
105-
11 => search_11(target, init),
106-
12 => search_12(target, init),
84+
if match init {
85+
[a, b, c, d, e, f, g, h, i, j, k, l] => {
86+
search_12(target, *a, *b, *c, *d, *e, *f, *g, *h, *i, *j, *k, *l)
87+
}
88+
[a, b, c, d, e, f, g, h, i, j, k] => {
89+
search_11(target, *a, *b, *c, *d, *e, *f, *g, *h, *i, *j, *k)
90+
}
91+
[a, b, c, d, e, f, g, h, i, j] => {
92+
search_10(target, *a, *b, *c, *d, *e, *f, *g, *h, *i, *j)
93+
}
94+
[a, b, c, d, e, f, g, h, i] => search_9(target, *a, *b, *c, *d, *e, *f, *g, *h, *i),
95+
[a, b, c, d, e, f, g, h] => search_8(target, *a, *b, *c, *d, *e, *f, *g, *h),
96+
[a, b, c, d, e, f, g] => search_7(target, *a, *b, *c, *d, *e, *f, *g),
97+
[a, b, c, d, e, f] => search_6(target, *a, *b, *c, *d, *e, *f),
98+
[a, b, c, d, e] => search_5(target, *a, *b, *c, *d, *e),
99+
[a, b, c, d] => search_4(target, *a, *b, *c, *d),
100+
[a, b, c] => search_3(target, *a, *b, *c),
101+
[a, b] => search_2(target, *a, *b),
102+
[a] => search_1(target, *a),
107103
_ => unreachable_unchecked(),
108104
} {
109105
sum += target;

0 commit comments

Comments
 (0)