heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs33
1 files changed, 10 insertions, 23 deletions
diff --git a/src/main.rs b/src/main.rs
index 92e2f71..215ee46 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -26,33 +26,22 @@ pub mod util;
pub use util::prelude::*;
pub fn iterg<I: Iterator<Item = (u8, u8, u16)>>(
- start: (u8, u8, u16, HashSet<(u8, u8)>),
+ start: (u8, u8, u16, Box<[u64; 312]>),
graph: &mut impl Fn((u8, u8, u16)) -> I,
end: &mut impl Fn((u8, u8)) -> bool,
finally: &mut impl FnMut(u16),
- i: &[&[u8]],
) {
if end((start.0, start.1)) {
finally(start.2);
} else {
graph((start.0, start.1, start.2))
.map(|(a, b, n)| {
- let mut m = start.3.clone();
- if m.insert((a, b)) {
- iterg((a, b, n, m), graph, end, finally, i)
- } else {
- // if n > 60 {
- // for (line, y) in i.iter().ι::<u8>() {
- // for (&elem, x) in line.iter().ι::<u8>() {
- // if m.contains(&(x, y)) {
- // print!("O");
- // } else {
- // print!("{}", elem as char);
- // }
- // }
- // println!();
- // }
- // }
+ let shift = (a.nat() * 141 + b.nat()) % 64;
+ let index = (a.nat() * 141 + b.nat()) / 64;
+ if start.3[index] & (1 << shift) == 0 {
+ let mut m = start.3.clone();
+ m[index] |= 1 << shift;
+ iterg((a, b, n, m), graph, end, finally)
}
})
.Θ();
@@ -65,7 +54,7 @@ pub fn run(i: &str) -> impl Display {
let end = (x.len() as u8 - 2, x.len() as u8 - 1);
let mut sum = 0;
iterg(
- (1u8, 0u8, 0u16, HashSet::from_iter([(1, 0)])),
+ (1u8, 0u8, 0u16, Box::new([0; 312])),
&mut |(x, y, n)| {
let v = match i[y.nat()][x.nat()] {
b'>' => vec![(x + 1, y, n + 1)],
@@ -80,18 +69,16 @@ pub fn run(i: &str) -> impl Display {
]
.into_iter()
.flatten()
- .fl(lt(i.len() as u8))
- .fr(lt(i.len() as u8))
+ .fl(lt(141))
+ .fr(lt(141))
.filter(|(x, y)| i[y.nat()][x.nat()] != b'#')
.map(|(x, y)| (x, y, n + 1))
.collect_vec(),
};
-
v.into_iter()
},
&mut |(x, y)| (x, y) == end,
&mut |x| sum = sum.max(x),
- i,
);
sum
}