@@ -12,73 +12,56 @@ pub fn part1(s: &str) -> u32 {
1212unsafe fn part1_inner ( s : & str ) -> u32 {
1313 let s = s. as_bytes ( ) ;
1414
15- let mut maps = [ [ 0u64 ; MAX_SIZE + 2 ] ; 9 ] ;
16-
17- let mut zeros = [ ( 0 , 0 ) ; MAX_SIZE * MAX_SIZE / 9 ] ;
18- let mut zeros_i = 0 ;
15+ let mut positions = [ ( 0u16 , [ 0u16 ; MAX_SIZE * MAX_SIZE / 9 ] ) ; 9 ] ;
16+ let mut first_map = [ 0u128 ; BIG_SIZE ] ;
17+ let mut zero_pos = 0 ;
1918
2019 let mut y = 0 ;
2120 let mut x = 0 ;
22- let mut size = 0 ;
2321 for i in 0 ..s. len ( ) {
2422 let c = s[ i] ;
2523 if c == b'\n' {
26- size = x;
2724 y += 1 ;
2825 x = 0 ;
2926 continue ;
3027 }
3128
32- let layer = c - b'0' ;
29+ let layer = ( c - b'0' ) as usize ;
3330 if layer == 0 {
34- zeros[ zeros_i] = ( x, y) ;
35- zeros_i += 1 ;
31+ first_map[ y * MAX_SIZE + x + MAX_SIZE ] = 1 << zero_pos;
32+ zero_pos += 1 ;
33+ zero_pos %= 128 ;
3634 } else {
37- maps[ layer as usize - 1 ] [ y + 1 ] |= 1 << x;
35+ let len = positions[ layer - 1 ] . 0 as usize ;
36+ positions[ layer - 1 ] . 1 [ len] = ( y * MAX_SIZE + x + MAX_SIZE ) as u16 ;
37+ positions[ layer - 1 ] . 0 += 1 ;
3838 }
3939 x += 1 ;
4040 }
4141
42- let mut next = & mut [ 0u64 ; MAX_SIZE + 2 ] ;
43- let mut current = & mut [ 0u64 ; MAX_SIZE + 2 ] ;
44-
4542 let mut sum = 0 ;
46- for ( x, y) in & zeros[ ..zeros_i] {
47- current[ * y + 1 ] |= 1 << * x;
48- for layer in 0 ..9 {
49- // for yp1 in 1..size + 1 {
50- // for x in 0..size {
51- // let c = if current[yp1] & (1 << x) != 0 {
52- // '#'
53- // } else {
54- // s[(yp1 - 1) * (size + 1) + x] as char
55- // };
56- // print!("{c}");
57- // }
58- // println!("");
59- // }
60- // println!("");
61-
62- for yp1 in 1 ..size + 1 {
63- let to_left = ( current[ yp1] << 1 ) & maps[ layer] [ yp1] ;
64- let to_right = ( current[ yp1] >> 1 ) & maps[ layer] [ yp1] ;
65- let to_down = current[ yp1 - 1 ] & maps[ layer] [ yp1] ;
66- let to_up = current[ yp1 + 1 ] & maps[ layer] [ yp1] ;
67-
68- let to_left_and_right = to_left | to_right;
69- let to_left_down_and_right = to_left_and_right | to_down;
70-
71- next[ yp1] = to_left_down_and_right | to_up;
72- }
73-
74- std:: mem:: swap ( & mut current, & mut next) ;
75- next. fill ( 0 ) ;
76- }
7743
78- for yp1 in 1 ..size + 1 {
79- sum += current[ yp1] . count_ones ( ) ;
44+ let mut next = & mut [ 0u128 ; BIG_SIZE ] ;
45+ let mut current = & mut first_map;
46+
47+ for layer in 0 ..8 {
48+ let ( len, positions) = positions[ layer] ;
49+
50+ for i in & positions[ ..len as usize ] {
51+ let i = * i as usize ;
52+ next[ i] =
53+ current[ i - 1 ] | current[ i + 1 ] | current[ i + MAX_SIZE ] | current[ i - MAX_SIZE ] ;
8054 }
81- current. fill ( 0 ) ;
55+
56+ std:: mem:: swap ( & mut current, & mut next) ;
57+ next. fill ( 0 ) ;
58+ }
59+
60+ let ( len9, positions9) = positions[ 8 ] ;
61+ for i in & positions9[ ..len9 as usize ] {
62+ let i = * i as usize ;
63+ sum += ( current[ i - 1 ] | current[ i + 1 ] | current[ i + MAX_SIZE ] | current[ i - MAX_SIZE ] )
64+ . count_ones ( ) ;
8265 }
8366
8467 sum
0 commit comments