Skip to content

Commit 8c4b7dd

Browse files
committed
Use map for part1
1 parent 281dcc7 commit 8c4b7dd

File tree

1 file changed

+59
-24
lines changed

1 file changed

+59
-24
lines changed

src/day24.rs

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ use aoc_runner_derive::aoc;
55
#[aoc(day24, part1)]
66
pub fn part1(s: &str) -> u64 {
77
let s = s.as_bytes();
8-
part1_inner(s);
9-
part1_inner(s);
10-
part1_inner(s);
118
part1_inner(s)
129

1310
// println!("digraph G {{");
@@ -97,26 +94,24 @@ impl Gate {
9794
if self.out_1 == 0 {
9895
self.out_1 = out;
9996
} else {
100-
// debug_assert!(self.out_2 == 0);
97+
debug_assert!(self.out_2 == 0);
10198
self.out_2 = out;
10299
}
103100
}
104101
}
105102

106-
#[inline(always)]
107-
fn part1_inner(s: &[u8]) -> u64 {
108-
static mut GATES: [Gate; 26 * 26 * 26 + 46] = [Gate {
109-
inp_1: false,
110-
out_1: 0,
111-
out_2: 0,
112-
state: State::Empty,
113-
}; 26 * 26 * 26 + 46];
103+
pub fn part1_inner(s: &[u8]) -> u64 {
104+
let mut gates_map = [0u16; 26 * 26 * 26];
114105

115-
let gates = unsafe { &mut *(&raw mut GATES) };
116-
for g in gates.iter_mut() {
117-
g.out_1 = 0;
118-
g.state = State::Empty;
119-
}
106+
let mut gates = heapless::Vec::<Gate, 512>::from_slice(
107+
&[Gate {
108+
inp_1: false,
109+
out_1: 0,
110+
out_2: 0,
111+
state: State::Empty,
112+
}; 46],
113+
)
114+
.unwrap();
120115

121116
let mut stack = heapless::Vec::<(u16, bool), 2048>::new();
122117

@@ -133,11 +128,25 @@ fn part1_inner(s: &[u8]) -> u64 {
133128
let this = if *s.get_unchecked(i + len + 12) == b'z' {
134129
(s.get_unchecked(i + len + 13) - b'0') as u16 * 10
135130
+ (s.get_unchecked(i + len + 14) - b'0') as u16
136-
+ 26 * 26 * 26
137131
} else {
138-
(s.get_unchecked(i + len + 12) - b'a') as u16 * 26 * 26
132+
let this = (s.get_unchecked(i + len + 12) - b'a') as u16 * 26 * 26
139133
+ (s.get_unchecked(i + len + 13) - b'a') as u16 * 26
140-
+ (s.get_unchecked(i + len + 14) - b'a') as u16
134+
+ (s.get_unchecked(i + len + 14) - b'a') as u16;
135+
136+
let real_this = *gates_map.get_unchecked(this as usize);
137+
if real_this == 0 {
138+
let i = gates.len() as u16;
139+
gates.push_unchecked(Gate {
140+
inp_1: false,
141+
out_1: 0,
142+
out_2: 0,
143+
state: State::Empty,
144+
});
145+
*gates_map.get_unchecked_mut(this as usize) = i;
146+
i
147+
} else {
148+
real_this
149+
}
141150
};
142151

143152
if *s.get_unchecked(i) == b'x' {
@@ -172,6 +181,34 @@ fn part1_inner(s: &[u8]) -> u64 {
172181
let from2 = (s.get_unchecked(i + len + 5) - b'a') as u16 * 26 * 26
173182
+ (s.get_unchecked(i + len + 6) - b'a') as u16 * 26
174183
+ (s.get_unchecked(i + len + 7) - b'a') as u16;
184+
let real_from1 = *gates_map.get_unchecked(from1 as usize);
185+
let from1 = if real_from1 == 0 {
186+
let i = gates.len() as u16;
187+
gates.push_unchecked(Gate {
188+
inp_1: false,
189+
out_1: 0,
190+
out_2: 0,
191+
state: State::Empty,
192+
});
193+
*gates_map.get_unchecked_mut(from1 as usize) = i;
194+
i
195+
} else {
196+
real_from1
197+
};
198+
let real_from2 = *gates_map.get_unchecked(from2 as usize);
199+
let from2 = if real_from2 == 0 {
200+
let i = gates.len() as u16;
201+
gates.push_unchecked(Gate {
202+
inp_1: false,
203+
out_1: 0,
204+
out_2: 0,
205+
state: State::Empty,
206+
});
207+
*gates_map.get_unchecked_mut(from2 as usize) = i;
208+
i
209+
} else {
210+
real_from2
211+
};
175212

176213
gates.get_unchecked_mut(from1 as usize).add_out(this);
177214
gates.get_unchecked_mut(from2 as usize).add_out(this);
@@ -191,8 +228,7 @@ fn part1_inner(s: &[u8]) -> u64 {
191228
_ => unreachable_unchecked(),
192229
};
193230

194-
if g > 26 * 26 * 26 {
195-
let g = g - 26 * 26 * 26;
231+
if g < 46 {
196232
zs |= (out as u64) << g;
197233
} else {
198234
let out_1 = gate.out_1;
@@ -237,8 +273,7 @@ pub fn part2(s: &str) -> &'static str {
237273

238274
const ZSTART: u16 = 26 * 26 * 26;
239275

240-
#[inline(always)]
241-
fn part2_inner(s: &[u8]) -> &'static str {
276+
pub fn part2_inner(s: &[u8]) -> &'static str {
242277
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
243278
enum State {
244279
Or,

0 commit comments

Comments
 (0)