Skip to content

Commit 3859921

Browse files
committed
Use bitvec
1 parent 48de02d commit 3859921

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

src/day23.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use core::str;
22

33
use aoc_runner_derive::aoc;
4+
use bitvec::array::BitArray;
45

56
const MAX: usize = 26 * 26;
67

@@ -67,11 +68,13 @@ pub fn part1(s: &str) -> u64 {
6768

6869
static mut SCRATCH: [u8; MAX_C * 3] = [0; MAX_C * 3];
6970

71+
const BAL: usize = (MAX * MAX).div_ceil(64);
72+
7073
#[aoc(day23, part2)]
7174
pub fn part2(s: &str) -> &'static str {
7275
let s = s.as_bytes();
7376

74-
let mut g = [[false; MAX]; MAX];
77+
let mut g = BitArray::<[u64; BAL]>::default();
7578

7679
let mut vertecies = const {
7780
let mut vs = [(0u16, 0); MAX];
@@ -91,10 +94,8 @@ pub fn part2(s: &str) -> &'static str {
9194
let cp2 = (s.get_unchecked(i + 3) - b'a') as u16 * 26
9295
+ (s.get_unchecked(i + 4) - b'a') as u16;
9396

94-
*g.get_unchecked_mut(cp2 as usize)
95-
.get_unchecked_mut(cp1 as usize) = true;
96-
*g.get_unchecked_mut(cp1 as usize)
97-
.get_unchecked_mut(cp2 as usize) = true;
97+
g.set(cp2 as usize * MAX + cp1 as usize, true);
98+
g.set(cp1 as usize * MAX + cp2 as usize, true);
9899
vertecies.get_unchecked_mut(cp1 as usize).1 += 1;
99100
vertecies.get_unchecked_mut(cp2 as usize).1 += 1;
100101

@@ -143,7 +144,7 @@ pub fn part2(s: &str) -> &'static str {
143144
// Using this algorithm: https://web.archive.org/web/20160911054636/http://www.dcs.gla.ac.uk/~pat/jchoco/clique/indSetMachrahanish/papers/tomita2003.pdf
144145
fn expand(
145146
mut r: &mut [(u16, u16)],
146-
g: &[[bool; MAX]; MAX],
147+
g: &BitArray<[u64; BAL]>,
147148
q: &mut heapless::Vec<u16, MAX_C>,
148149
q_max: &mut heapless::Vec<u16, MAX_C>,
149150
cs: &mut [heapless::Vec<u16, MAX_C>; MAX_C],
@@ -155,7 +156,7 @@ fn expand(
155156

156157
let mut new_r = heapless::Vec::<(u16, u16), MAX_C>::new();
157158
for (i, _) in rest.iter() {
158-
if g[p][*i as usize] {
159+
if g[*i as usize * MAX + p] {
159160
new_r.push((*i, 0)).unwrap();
160161
}
161162
}
@@ -176,7 +177,7 @@ fn expand(
176177

177178
fn number_sort(
178179
r: &mut [(u16, u16)],
179-
g: &[[bool; MAX]; MAX],
180+
g: &BitArray<[u64; BAL]>,
180181
cs: &mut [heapless::Vec<u16, MAX_C>; MAX_C],
181182
) {
182183
let mut maxno = 0;
@@ -191,7 +192,7 @@ fn number_sort(
191192

192193
'outer: loop {
193194
for i in &cs[k] {
194-
if g[p][*i as usize] {
195+
if g[*i as usize * MAX + p] {
195196
k += 1;
196197
continue 'outer;
197198
}

0 commit comments

Comments
 (0)