Skip to content

Commit 3040d5b

Browse files
committed
Optimise memory usage of part 2
1 parent 79af92d commit 3040d5b

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

src/day16.rs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ fn inner_part2(s: &[u8]) -> u64 {
187187
let mut min_cost = u32::MAX;
188188

189189
let mut prev = [[0u32; 3]; MAX_INDX * 4];
190-
let mut lens = [[0u32; 3]; MAX_INDX * 4];
191190

192191
while let Some(state) = to_see.pop() {
193192
// println!("{}, {:?}", state.i, state.d);
@@ -207,8 +206,11 @@ fn inner_part2(s: &[u8]) -> u64 {
207206
if new_cost < costs[get_idx(new_i, new_d)] {
208207
costs[get_idx(new_i, new_d)] = new_cost;
209208

210-
prev[get_idx(new_i, new_d)] = [get_idx(state.i, state.d) as u32, 0, 0];
211-
lens[get_idx(new_i, new_d)] = [move_len - 1, 0, 0];
209+
prev[get_idx(new_i, new_d)] = [
210+
get_idx(state.i, state.d) as u32 | (move_len - 1) << 20,
211+
0,
212+
0,
213+
];
212214

213215
let h = hueristic(new_i, new_d);
214216
to_see
@@ -221,12 +223,12 @@ fn inner_part2(s: &[u8]) -> u64 {
221223
.unwrap();
222224
} else if new_cost == costs[get_idx(new_i, new_d)] {
223225
for i in 0..3 {
224-
let p = prev[get_idx(new_i, new_d)][i];
226+
let p = prev[get_idx(new_i, new_d)][i] & 0xFFFFF;
225227
if p == get_idx(state.i, state.d) as u32 {
226228
break;
227229
} else if p == 0 {
228-
prev[get_idx(new_i, new_d)][i] = get_idx(state.i, state.d) as u32;
229-
lens[get_idx(new_i, new_d)][i] = move_len - 1;
230+
prev[get_idx(new_i, new_d)][i] =
231+
get_idx(state.i, state.d) as u32 | (move_len - 1) << 20;
230232
break;
231233
}
232234
}
@@ -243,7 +245,6 @@ fn inner_part2(s: &[u8]) -> u64 {
243245
}
244246

245247
let mut visited_small = [false; MAX_INDX];
246-
let mut visited = [false; MAX_INDX * 4];
247248

248249
let mut stack = heapless::Vec::<u32, 64>::new();
249250
stack.push(get_idx(END, Direction::E) as u32).unwrap();
@@ -256,28 +257,28 @@ fn inner_part2(s: &[u8]) -> u64 {
256257
sum += 1;
257258
}
258259

259-
if !visited[i as usize] {
260-
visited[i as usize] = true;
260+
let mut done = [0; 2];
261+
'branches: for j in 0..3 {
262+
let prev = prev[i as usize][j];
263+
let len = prev >> 20;
264+
let prev = prev & 0xFFFFF;
261265

262-
let mut done = [0; 2];
263-
'branches: for j in 0..3 {
264-
if prev[i as usize][j] != 0 {
265-
let next_i = prev[i as usize][j];
266-
stack.push(next_i).unwrap();
266+
if prev != 0 {
267+
stack.push(prev).unwrap();
267268

268-
for l in 0..j {
269-
if done[l] == next_i % MAX_INDX as u32 {
270-
continue 'branches;
271-
}
269+
for l in 0..j {
270+
if done[l] == prev % MAX_INDX as u32 {
271+
continue 'branches;
272272
}
273-
done[j] = next_i % MAX_INDX as u32;
274-
275-
sum += lens[i as usize][j];
276-
} else {
277-
break;
278273
}
274+
done[j] = prev % MAX_INDX as u32;
275+
276+
sum += len;
277+
} else {
278+
break;
279279
}
280280
}
281+
prev[i as usize] = [0, 0, 0];
281282
}
282283

283284
// for i in 0..(SIZE * SIZE1) - 1 {

0 commit comments

Comments
 (0)