@@ -8,12 +8,15 @@ pub fn part1(s: &str) -> u32 {
88 unsafe { part1_inner ( s) }
99}
1010
11+ static mut MAPS_PART1 : [ [ u64 ; BIG_SIZE ] ; 9 ] = [ [ 0 ; BIG_SIZE ] ; 9 ] ;
12+ static mut MAPS_PART2 : [ [ u16 ; BIG_SIZE ] ; 9 ] = [ [ 0 ; BIG_SIZE ] ; 9 ] ;
13+
1114#[ target_feature( enable = "avx2,bmi1,bmi2,cmpxchg16b,lzcnt,movbe,popcnt" ) ]
1215unsafe fn part1_inner ( s : & str ) -> u32 {
1316 let s = s. as_bytes ( ) ;
1417
1518 let mut positions = [ ( 0u16 , [ 0u16 ; MAX_SIZE * MAX_SIZE / 9 ] ) ; 9 ] ;
16- let mut maps = [ [ 0u64 ; BIG_SIZE ] ; 9 ] ;
19+ let maps = & mut MAPS_PART1 ;
1720 let mut zero_pos = 0 ;
1821
1922 let mut y = 0 ;
@@ -82,7 +85,7 @@ unsafe fn part2_inner(s: &str) -> u16 {
8285 let s = s. as_bytes ( ) ;
8386
8487 let mut positions = [ ( 0u16 , [ 0u16 ; MAX_SIZE * MAX_SIZE / 9 ] ) ; 9 ] ;
85- let mut first_map = [ 0u16 ; BIG_SIZE ] ;
88+ let mut maps = & mut MAPS_PART2 ;
8689
8790 let mut y = 0 ;
8891 let mut x = 0 ;
@@ -96,7 +99,9 @@ unsafe fn part2_inner(s: &str) -> u16 {
9699
97100 let layer = ( c - b'0' ) as usize ;
98101 if layer == 0 {
99- * first_map. get_unchecked_mut ( y * MAX_SIZE + x + MAX_SIZE ) = 1 ;
102+ * maps
103+ . get_unchecked_mut ( 0 )
104+ . get_unchecked_mut ( y * MAX_SIZE + x + MAX_SIZE ) = 1 ;
100105 } else {
101106 let len = positions. get_unchecked ( layer - 1 ) . 0 as usize ;
102107 * positions
@@ -110,31 +115,26 @@ unsafe fn part2_inner(s: &str) -> u16 {
110115
111116 let mut sum = 0 ;
112117
113- let mut next = & mut [ 0u16 ; BIG_SIZE ] ;
114- let mut current = & mut first_map;
115-
116118 for layer in 0 ..8 {
117119 let ( len, positions) = * positions. get_unchecked ( layer) ;
118120
119121 for i in & * positions. get_unchecked ( ..len as usize ) {
120122 let i = * i as usize ;
121- * next. get_unchecked_mut ( i) = * current. get_unchecked ( i - 1 )
122- + * current. get_unchecked ( i + 1 )
123- + * current. get_unchecked ( i + MAX_SIZE )
124- + * current. get_unchecked ( i - MAX_SIZE ) ;
123+ * maps. get_unchecked_mut ( layer + 1 ) . get_unchecked_mut ( i) =
124+ * maps. get_unchecked_mut ( layer) . get_unchecked ( i - 1 )
125+ + * maps. get_unchecked_mut ( layer) . get_unchecked ( i + 1 )
126+ + * maps. get_unchecked_mut ( layer) . get_unchecked ( i + MAX_SIZE )
127+ + * maps. get_unchecked_mut ( layer) . get_unchecked ( i - MAX_SIZE ) ;
125128 }
126-
127- std:: mem:: swap ( & mut current, & mut next) ;
128- next. fill ( 0 ) ;
129129 }
130130
131131 let ( len9, positions9) = * positions. get_unchecked ( 8 ) ;
132132 for i in & positions9[ ..len9 as usize ] {
133133 let i = * i as usize ;
134- sum += * current . get_unchecked ( i - 1 )
135- + * current . get_unchecked ( i + 1 )
136- + * current . get_unchecked ( i + MAX_SIZE )
137- + * current . get_unchecked ( i - MAX_SIZE ) ;
134+ sum += * maps . get_unchecked_mut ( 8 ) . get_unchecked ( i - 1 )
135+ + * maps . get_unchecked_mut ( 8 ) . get_unchecked ( i + 1 )
136+ + * maps . get_unchecked_mut ( 8 ) . get_unchecked ( i + MAX_SIZE )
137+ + * maps . get_unchecked_mut ( 8 ) . get_unchecked ( i - MAX_SIZE ) ;
138138 }
139139
140140 sum
0 commit comments