@@ -3,50 +3,40 @@ use std::{hint::unreachable_unchecked, mem::MaybeUninit, num::NonZero};
33use aoc_runner_derive:: aoc;
44
55macro_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