@@ -26,14 +26,6 @@ fn part1_inner(s: &str) -> u64 {
2626 let mut masts: [ ArrayVec < [ i32 ; 4 ] > ; FREQ_RANGE ] =
2727 [ ArrayVec :: from_array_empty ( [ 0 ; 4 ] ) ; FREQ_RANGE ] ;
2828
29- let mut antinodes = [ false ; ( SIZE * SIZE ) as usize ] ;
30- let mut total_antinotedes = 0 ;
31-
32- let mut set_node = |x, y| {
33- total_antinotedes += !antinodes[ ( y * SIZE + x) as usize ] as u64 ;
34- antinodes[ ( y * SIZE + x) as usize ] = true ;
35- } ;
36-
3729 // let mut numbers = [0; 5];
3830
3931 for i in unsafe { OneInv :: new_unchecked ( b'.' ) . iter ( s) } {
@@ -43,38 +35,51 @@ fn part1_inner(s: &str) -> u64 {
4335 let f = s[ i] - b'0' ;
4436 let i = i as i32 ;
4537
46- let new_x = i % SIZE1 ;
47- let new_y = i / SIZE1 ;
48-
49- // numbers[masts[f as usize].len()] += 1;
38+ masts[ f as usize ] . push ( i) ;
39+ }
5040
51- for mast_i in & masts[ f as usize ] {
52- let mast_x = mast_i % SIZE1 ;
53- let mast_y = mast_i / SIZE1 ;
41+ let mut antinodes = [ false ; ( SIZE * SIZE ) as usize ] ;
42+ let mut total_antinotedes = 0 ;
5443
55- let diff_x = mast_x - new_x;
56- let diff_y = ( new_y - mast_y) . abs ( ) as i32 ;
44+ let mut set_node = |x, y| {
45+ total_antinotedes += !antinodes[ ( y * SIZE + x) as usize ] as u64 ;
46+ antinodes[ ( y * SIZE + x) as usize ] = true ;
47+ } ;
5748
58- let node_x = mast_x + diff_x;
59- if node_x >= 0 && node_x < SIZE && mast_y >= diff_y {
60- let node_y = mast_y - diff_y;
49+ for masts in masts {
50+ for i in 0 ..masts. len ( ) {
51+ let new_x = masts[ i] % SIZE1 ;
52+ let new_y = masts[ i] / SIZE1 ;
6153
62- set_node ( node_x, node_y) ;
63- }
54+ for other_i in 0 ..masts. len ( ) {
55+ if other_i == i {
56+ continue ;
57+ }
58+ let mast_x = masts[ other_i] % SIZE1 ;
59+ let mast_y = masts[ other_i] / SIZE1 ;
6460
65- let node_x = new_x - diff_x;
66- if node_x >= 0 && node_x < SIZE && new_y + diff_y < SIZE {
67- let node_y = new_y + diff_y;
61+ let node_x = mast_x + mast_x - new_x;
62+ let node_y = mast_y + mast_y - new_y;
6863
69- set_node ( node_x, node_y) ;
64+ if node_x >= 0 && node_x < SIZE && node_y >= 0 && node_y < SIZE {
65+ set_node ( node_x, node_y) ;
66+ }
7067 }
7168 }
72-
73- masts[ f as usize ] . push ( i) ;
7469 }
7570
76- // for i in 0..5 {
77- // println!("{i}: {}", numbers[i]);
71+ // for y in 0..SIZE {
72+ // for x in 0..SIZE {
73+ // print!(
74+ // "{}",
75+ // if antinodes[(y * SIZE + x) as usize] {
76+ // '#'
77+ // } else {
78+ // s[(y * SIZE1 + x) as usize] as char
79+ // }
80+ // )
81+ // }
82+ // println!("");
7883 // }
7984
8085 total_antinotedes
@@ -94,12 +99,7 @@ fn part2_inner(s: &str) -> u64 {
9499 let mut masts: [ ArrayVec < [ i32 ; 4 ] > ; FREQ_RANGE ] =
95100 [ ArrayVec :: from_array_empty ( [ 0 ; 4 ] ) ; FREQ_RANGE ] ;
96101
97- let mut antinodes = [ false ; ( SIZE * SIZE ) as usize ] ;
98- let mut total_antinotedes = 0 ;
99- let mut set_node = |x, y| {
100- total_antinotedes += !antinodes[ ( y * SIZE + x) as usize ] as u64 ;
101- antinodes[ ( y * SIZE + x) as usize ] = true ;
102- } ;
102+ // let mut numbers = [0; 5];
103103
104104 for i in unsafe { OneInv :: new_unchecked ( b'.' ) . iter ( s) } {
105105 if s[ i] == b'\n' {
@@ -108,44 +108,41 @@ fn part2_inner(s: &str) -> u64 {
108108 let f = s[ i] - b'0' ;
109109 let i = i as i32 ;
110110
111- let new_x = i % SIZE1 ;
112- let new_y = i / SIZE1 ;
113- for mast_i in & masts[ f as usize ] {
114- let mast_x = mast_i % SIZE1 ;
115- let mast_y = mast_i / SIZE1 ;
116-
117- let o_diff_x = mast_x - new_x;
118- let o_diff_y = ( new_y - mast_y) . abs ( ) as i32 ;
119-
120- for k in 0 .. {
121- let diff_x = o_diff_x * k;
122- let diff_y = o_diff_y * k;
123-
124- let mut new_node = false ;
111+ masts[ f as usize ] . push ( i) ;
112+ }
125113
126- let node_x = mast_x + diff_x;
127- if node_x >= 0 && node_x < SIZE && mast_y >= diff_y {
128- let node_y = mast_y - diff_y;
114+ let mut antinodes = [ false ; ( SIZE * SIZE ) as usize ] ;
115+ let mut total_antinotedes = 0 ;
129116
130- new_node = true ;
131- set_node ( node_x, node_y) ;
132- }
117+ let mut set_node = |x, y| {
118+ total_antinotedes += !antinodes[ ( y * SIZE + x) as usize ] as u64 ;
119+ antinodes[ ( y * SIZE + x) as usize ] = true ;
120+ } ;
133121
134- let node_x = new_x - diff_x;
135- if node_x >= 0 && node_x < SIZE && new_y + diff_y < SIZE {
136- let node_y = new_y + diff_y;
122+ for masts in masts {
123+ for i in 0 ..masts. len ( ) {
124+ let new_x = masts[ i] % SIZE1 ;
125+ let new_y = masts[ i] / SIZE1 ;
137126
138- new_node = true ;
139- set_node ( node_x, node_y) ;
127+ for other_i in 0 ..masts. len ( ) {
128+ if other_i == i {
129+ continue ;
140130 }
141-
142- if !new_node {
143- break ;
131+ let mast_x = masts[ other_i] % SIZE1 ;
132+ let mast_y = masts[ other_i] / SIZE1 ;
133+
134+ for k in 0 .. {
135+ let node_x = mast_x + ( mast_x - new_x) * k;
136+ let node_y = mast_y + ( mast_y - new_y) * k;
137+
138+ if node_x >= 0 && node_x < SIZE && node_y >= 0 && node_y < SIZE {
139+ set_node ( node_x, node_y) ;
140+ } else {
141+ break ;
142+ }
144143 }
145144 }
146145 }
147-
148- masts[ f as usize ] . push ( i) ;
149146 }
150147
151148 total_antinotedes
0 commit comments