Skip to content

Commit a25fc4a

Browse files
committed
Update part 2
1 parent 845f178 commit a25fc4a

File tree

1 file changed

+68
-34
lines changed

1 file changed

+68
-34
lines changed

src/day8.rs

Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ unsafe fn part1_inner(s: &str) -> u32 {
9090
let node_y = new_y + diff_y;
9191

9292
*antinodes.get_unchecked_mut(node_y as usize) |= if diff_x.is_positive() {
93-
1 << new_x << diff_x
93+
1 << new_x >> diff_x
9494
} else {
95-
1 << new_x >> -diff_x
95+
1 << new_x << -diff_x
9696
};
9797
}
9898
}
@@ -120,78 +120,112 @@ unsafe fn part1_inner(s: &str) -> u32 {
120120
}
121121

122122
#[aoc(day8, part2)]
123-
pub fn part2(s: &str) -> u64 {
124-
#[expect(unused_unsafe)]
125-
unsafe {
126-
part2_inner(s)
127-
}
123+
pub fn part2(s: &str) -> u32 {
124+
unsafe { part2_inner(s) }
128125
}
129126

130-
fn part2_inner(s: &str) -> u64 {
127+
unsafe fn part2_inner(s: &str) -> u32 {
128+
#[cfg(not(test))]
129+
const SIZE: i16 = 50;
130+
#[cfg(test)]
131+
const SIZE: i16 = 12;
132+
133+
const SIZE1: i16 = SIZE + 1;
134+
131135
let s = s.as_bytes();
132136

133-
let mut masts: [ArrayVec<[i32; 4]>; FREQ_RANGE] =
134-
[ArrayVec::from_array_empty([0; 4]); FREQ_RANGE];
137+
let mut masts: [ArrayVec<[(i16, i16); 3]>; FREQ_RANGE] =
138+
[ArrayVec::from_array_empty([(0, 0); 3]); FREQ_RANGE];
135139

136-
let mut antinodes = [false; (SIZE * SIZE) as usize];
137-
let mut total_antinotedes = 0;
138-
let mut set_node = |x, y| {
139-
total_antinotedes += !antinodes[(y * SIZE + x) as usize] as u64;
140-
antinodes[(y * SIZE + x) as usize] = true;
141-
};
140+
let mut antinodes = [0u64; SIZE as usize];
142141

143142
for i in unsafe { OneInv::new_unchecked(b'.').iter(s) } {
144143
if s[i] == b'\n' {
145144
continue;
146145
}
147146
let f = s[i] - b'0';
148-
let i = i as i32;
147+
let i = i as i16;
149148

150149
let new_x = i % SIZE1;
151150
let new_y = i / SIZE1;
152-
for mast_i in &masts[f as usize] {
153-
let mast_x = mast_i % SIZE1;
154-
let mast_y = mast_i / SIZE1;
155151

156-
let o_diff_x = mast_x - new_x;
157-
let o_diff_y = (new_y - mast_y).abs() as i32;
152+
// numbers[masts[f as usize].len()] += 1;
153+
154+
for (mast_y, mast_x) in masts.get_unchecked(f as usize) {
155+
let diff_x_o = mast_x - new_x;
156+
let diff_y_o = new_y - mast_y;
158157

159158
for k in 0.. {
160-
let diff_x = o_diff_x * k;
161-
let diff_y = o_diff_y * k;
159+
let diff_x = diff_x_o * k;
160+
let diff_y = diff_y_o * k;
162161

163-
let node_x = mast_x + diff_x;
164-
if node_x >= 0 && node_x < SIZE && mast_y >= diff_y {
162+
if *mast_y >= diff_y {
165163
let node_y = mast_y - diff_y;
166-
set_node(node_x, node_y);
164+
165+
let field = if diff_x.is_positive() {
166+
1 << mast_x << diff_x
167+
} else {
168+
1 << mast_x >> -diff_x
169+
};
170+
if field == 0 {
171+
break;
172+
} else {
173+
*antinodes.get_unchecked_mut(node_y as usize) |= field;
174+
}
167175
} else {
168176
break;
169177
}
170178
}
171179

172180
for k in 0.. {
173-
let diff_x = o_diff_x * k;
174-
let diff_y = o_diff_y * k;
181+
let diff_x = diff_x_o * k;
182+
let diff_y = diff_y_o * k;
175183

176-
let node_x = new_x - diff_x;
177-
if node_x >= 0 && node_x < SIZE && new_y + diff_y < SIZE {
184+
if new_y + diff_y < SIZE {
178185
let node_y = new_y + diff_y;
179-
set_node(node_x, node_y);
186+
187+
let field = if diff_x.is_positive() {
188+
1 << new_x >> diff_x
189+
} else {
190+
1 << new_x << -diff_x
191+
};
192+
if field == 0 {
193+
break;
194+
} else {
195+
*antinodes.get_unchecked_mut(node_y as usize) |= field;
196+
}
180197
} else {
181198
break;
182199
}
183200
}
184201
}
185202

186-
masts[f as usize].push(i);
203+
masts[f as usize].try_push((new_y, new_x));
187204
}
205+
// for y in 0..SIZE {
206+
// for x in 0..SIZE {
207+
// print!(
208+
// "{}",
209+
// if antinodes[y as usize] & 1 << x != 0 {
210+
// '#'
211+
// } else {
212+
// s[(y * SIZE1 + x) as usize] as char
213+
// }
214+
// )
215+
// }
216+
// println!("");
217+
// }
188218

189-
total_antinotedes
219+
antinodes
220+
.iter()
221+
.map(|field| (field & FIELD_SIZE).count_ones())
222+
.sum()
190223
}
191224

192225
#[cfg(test)]
193226
mod tests {
194227
use super::*;
228+
195229
const EXAMPLE: &str = r"............
196230
........0...
197231
.....0......

0 commit comments

Comments
 (0)