heh
use bitsets
bendn 2023-12-16
parent 03ad7bb · commit fd0c542
-rw-r--r--src/main.rs32
-rw-r--r--src/util.rs3
2 files changed, 17 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs
index 6599d82..ff57183 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -37,26 +37,25 @@ macro_rules! sret {
fn test(mat: &[&[u8]], p: (u8, u8), d: D) -> u16 {
use D::*;
- let mut e = vec![vec![false; mat.len()]; mat.len()];
+ let mut e = vec![0u128; mat.len()];
let mut been = HashSet::new();
fn beam(
mat: &[&[u8]],
(mut x, mut y): (u8, u8),
mut d: D,
- e: &mut [Vec<bool>],
+ e: &mut [u128],
been: &mut HashSet<(u8, u8, D)>,
) {
loop {
if y >= mat.len() as u8 || x >= mat.len() as u8 {
break;
}
- e[y.nat()][x.nat()] = true;
- match (mat[y.nat()][x.nat()], d) {
+ bits!(e[y.nat()] + x);
+ let w = (mat[y.nat()][x.nat()], d);
+ mat! { w {
(b'|', E | W) => {
if been.insert((x, y, N)) {
- if let Some(v) = y.checked_sub(1)
- && been.insert((x, v, N))
- {
+ if let Some(v) = y.checked_sub(1) {
beam(mat, (x, v), N, e, been);
}
d = S;
@@ -64,7 +63,7 @@ fn test(mat: &[&[u8]], p: (u8, u8), d: D) -> u16 {
} else {
return;
}
- }
+ },
(b'-', N | S) => {
if been.insert((x, y, N)) {
if let Some(v) = x.checked_sub(1) {
@@ -75,7 +74,7 @@ fn test(mat: &[&[u8]], p: (u8, u8), d: D) -> u16 {
} else {
return;
}
- }
+ },
(b'|' | b'.', N) => sret!(y -= 1),
(b'-' | b'.', E) => x += 1,
(b'|' | b'.', S) => y += 1,
@@ -83,27 +82,24 @@ fn test(mat: &[&[u8]], p: (u8, u8), d: D) -> u16 {
(b'/', N) | (b'\\', S) => {
d = E;
x += 1;
- }
+ },
(b'/', E) | (b'\\', W) => {
d = N;
sret!(y -= 1);
- }
+ },
(b'/', S) | (b'\\', N) => {
d = W;
sret!(x -= 1);
- }
+ },
(b'/', W) | (b'\\', E) => {
d = S;
y += 1;
- }
- _ => unreachable!(),
- }
+ },
+ }}
}
}
beam(&mat, p, d, &mut e, &mut been);
- e.iter()
- .map(|x| x.iter().filter(|x| **x).count() as u16)
- .sum::<u16>()
+ e.iter().map(|x| x.count_ones() as u16).sum::<u16>()
}
pub fn run(i: &str) -> impl Display {
diff --git a/src/util.rs b/src/util.rs
index 24148ec..91b9286 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -629,6 +629,9 @@ macro_rules! bits {
($bitset:ident + $bit:expr) => {
$bitset |= 1 << $bit
};
+ ($holder:ident[$index:expr] + $bit:expr) => {
+ $holder[$index] |= 1 << $bit;
+ };
($bitset:ident[$bit:expr]) => {
($bitset & 1 << $bit) != 0
};