Skip to content

Commit 1fc861c

Browse files
committed
Dont swap
1 parent 3bc63bb commit 1fc861c

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

src/day19.rs

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ unsafe fn inner_part1(s: &[u8]) -> u64 {
110110

111111
let mut states1_start = true;
112112
let mut states2_start;
113-
let mut states1_other_states = &mut heapless::Vec::<u16, NFA_SIZE>::new();
114-
let mut states2_other_states = &mut heapless::Vec::<u16, NFA_SIZE>::new();
113+
let mut states1_other_states = heapless::Vec::<u16, NFA_SIZE>::new();
114+
let mut states2_other_states = heapless::Vec::<u16, NFA_SIZE>::new();
115115

116116
while i < s.len() {
117117
if *s.get_unchecked(i) == b'\n' {
@@ -144,10 +144,51 @@ unsafe fn inner_part1(s: &[u8]) -> u64 {
144144
states2_other_states.push_unchecked(next.get_next());
145145
}
146146
}
147-
std::mem::swap(&mut states2_other_states, &mut states1_other_states);
148-
std::mem::swap(&mut states2_start, &mut states1_start);
149147

150-
if states1_start == false && states1_other_states.is_empty() {
148+
if states2_start == false && states2_other_states.is_empty() {
149+
while i < s.len() && *s.get_unchecked(i) != b'\n' {
150+
i += 1;
151+
}
152+
} else {
153+
i += 1;
154+
}
155+
156+
if i >= s.len() {
157+
break;
158+
}
159+
160+
if *s.get_unchecked(i) == b'\n' {
161+
if states2_start {
162+
sum += 1;
163+
}
164+
states1_other_states.clear();
165+
states1_start = true;
166+
i += 1;
167+
continue;
168+
}
169+
let color = to_idx(*s.get_unchecked(i));
170+
171+
states1_other_states.clear();
172+
states1_start = false;
173+
174+
if states2_start {
175+
let next = nfa.get_unchecked(0).get_unchecked(color);
176+
177+
states1_start |= next.has_start();
178+
if next.get_next() != 0 {
179+
states1_other_states.push_unchecked(next.get_next());
180+
}
181+
}
182+
for s in states2_other_states.iter() {
183+
let next = nfa.get_unchecked(*s as usize).get_unchecked(color);
184+
185+
states1_start |= next.has_start();
186+
if next.get_next() != 0 {
187+
states1_other_states.push_unchecked(next.get_next());
188+
}
189+
}
190+
191+
if states2_start == false && states2_other_states.is_empty() {
151192
while i < s.len() && *s.get_unchecked(i) != b'\n' {
152193
i += 1;
153194
}

0 commit comments

Comments
 (0)