Skip to content

Commit 2aa4945

Browse files
committed
Dont swap part 2
1 parent 1fc861c commit 2aa4945

File tree

1 file changed

+49
-5
lines changed

1 file changed

+49
-5
lines changed

src/day19.rs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ unsafe fn inner_part2(s: &[u8]) -> u64 {
243243

244244
let mut states1_start = 1;
245245
let mut states2_start;
246-
let mut states1_other_states = &mut heapless::Vec::<(u16, u64), NFA_SIZE>::new();
247-
let mut states2_other_states = &mut heapless::Vec::<(u16, u64), NFA_SIZE>::new();
246+
let mut states1_other_states = heapless::Vec::<(u16, u64), NFA_SIZE>::new();
247+
let mut states2_other_states = heapless::Vec::<(u16, u64), NFA_SIZE>::new();
248248

249249
while i < s.len() {
250250
if *s.get_unchecked(i) == b'\n' {
@@ -280,10 +280,54 @@ unsafe fn inner_part2(s: &[u8]) -> u64 {
280280
states2_other_states.push_unchecked((next.get_next(), *amount));
281281
}
282282
}
283-
std::mem::swap(&mut states2_start, &mut states1_start);
284-
std::mem::swap(&mut states2_other_states, &mut states1_other_states);
285283

286-
if states1_start == 0 && states1_other_states.is_empty() {
284+
if states2_start == 0 && states2_other_states.is_empty() {
285+
while i < s.len() && *s.get_unchecked(i) != b'\n' {
286+
i += 1;
287+
}
288+
} else {
289+
i += 1;
290+
}
291+
292+
if i >= s.len() {
293+
break;
294+
}
295+
296+
if *s.get_unchecked(i) == b'\n' {
297+
sum += states2_start;
298+
299+
states1_other_states.clear();
300+
states1_start = 1;
301+
i += 1;
302+
continue;
303+
}
304+
let color = to_idx(*s.get_unchecked(i));
305+
306+
states1_other_states.clear();
307+
states1_start = 0;
308+
309+
if states2_start > 0 {
310+
let next = nfa.get_unchecked(0).get_unchecked(color);
311+
312+
if next.has_start() {
313+
states1_start += states2_start;
314+
}
315+
if next.get_next() != 0 {
316+
states1_other_states.push_unchecked((next.get_next(), states2_start));
317+
}
318+
}
319+
for (s, amount) in states2_other_states.iter() {
320+
let next = nfa.get_unchecked(*s as usize).get_unchecked(color);
321+
322+
if next.has_start() {
323+
states1_start += amount;
324+
}
325+
if next.get_next() != 0 {
326+
states1_other_states.push_unchecked((next.get_next(), *amount));
327+
}
328+
}
329+
330+
if states2_start == 0 && states2_other_states.is_empty() {
287331
while i < s.len() && *s.get_unchecked(i) != b'\n' {
288332
i += 1;
289333
}

0 commit comments

Comments
 (0)