heh
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs112
1 files changed, 22 insertions, 90 deletions
diff --git a/src/main.rs b/src/main.rs
index 9e77624..aa6a487 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -69,105 +69,37 @@ pub use util::prelude::*;
use crate::util::{MapF, UnionFind};
#[unsafe(no_mangle)]
-// #[implicit_fn::implicit_fn]
+#[implicit_fn::implicit_fn]
pub unsafe fn p1(x: &'static [u8; ISIZE]) -> impl Debug {
- let mut registers = [0i64; 26];
- let instrs = x.行().collect::<Vec<_>>();
- let mut p = 0;
- let mut snds = vec![];
- use crossbeam::channel::unbounded;
+ let value = x.chunked::<202>();
+ let mut dir = Dir::S;
+ let mut start = value.find(b'|');
+ let mut letters = vec![];
+ let mut steps = 0;
loop {
- let Some((a, x)) = instrs.get(p).map(|x| x.μ(' ')) else {
- break;
- };
- let reg = (x[0].wrapping_sub(b'a')) as usize;
- let rval = if x[0] == b'1' { 1 } else { registers[reg] };
-
- let b = (x.len() > 1).then(|| {
- x[1..]
- .str()
- .trim_ascii()
- .parse::<i64>()
- .unwrap_or_else(|_| registers[(x[2] - b'a') as usize])
- });
- match a {
- b"snd" => snds.push(rval),
- b"jgz" if rval > 0 => {
- p = (p as i64 + b.unwrap()) as usize;
- continue;
+ steps += 1;
+ match value[start.1][start.0] {
+ b'+' => {
+ (dir, start) = [dir.turn_90(), dir.turn_90ccw()]
+ .into_iter()
+ .fmap_w(_ + start)
+ .find(|&(_, (x, y))| !value[y][x].is_ascii_whitespace())
+ .unwrap();
}
- b"set" => registers[reg] = b.unwrap(),
-
- b"mod" => registers[reg] %= b.unwrap(),
-
- b"mul" => registers[reg] *= b.unwrap(),
- b"add" => registers[reg] += b.unwrap(),
-
- b"rcv" if rval != 0 => panic!("{snds:?}"),
-
- _ => {}
- }
- p += 1;
- }
- registers[1]
-}
-use crossbeam::channel::{self, Receiver, Sender, unbounded};
-
-pub fn p2(x: &'static [u8]) -> impl Debug {
- // thought about coroutines, but eh.
- let (tx, rx) = unbounded();
- let (tx2, rx2) = unbounded();
- let count = &*Box::leak(Box::new(AtomicUsize::new(0)));
- std::thread::spawn(move || prog(0, x, (tx2, rx), &AtomicUsize::new(0)));
- std::thread::spawn(move || prog(1, x, (tx, rx2), count));
- std::thread::sleep(Duration::from_millis(150));
- count.load(Ordering::Relaxed)
-}
-
-pub fn prog(
- id: i64,
- x: &'static [u8],
- (tx, rx): (Sender<i64>, Receiver<i64>),
- count: &AtomicUsize,
-) {
- let mut registers = [0i64; 26];
- registers[(b'p' - b'a') as usize] = id;
- let instrs = x.行().collect::<Vec<_>>();
- let mut p = 0;
- loop {
- let (a, x) = instrs.get(p).map(|x| x.μ(' ')).unwrap();
- let reg = (x[0].wrapping_sub(b'a')) as usize;
- let rval = if x[0] == b'1' { 1 } else { registers[reg] };
-
- let b = (x.len() > 1).then(|| {
- x[1..]
- .str()
- .trim_ascii()
- .parse::<i64>()
- .unwrap_or_else(|_| registers[(x[2] - b'a') as usize])
- });
- match a {
- b"snd" => {
- count.fetch_add(1, Ordering::Relaxed);
- tx.send(rval).unwrap();
- }
- b"jgz" if rval > 0 => {
- p = (p as i64 + b.unwrap()) as usize;
- continue;
+ b' ' => return (letters.str().to_owned(), steps),
+ l => {
+ if l.is_ascii_alphabetic() {
+ letters.push(l)
+ }
+ start = (dir + start).unwrap()
}
- b"set" => registers[reg] = b.unwrap(),
- b"mod" => registers[reg] %= b.unwrap(),
- b"mul" => registers[reg] *= b.unwrap(),
- b"add" => registers[reg] += b.unwrap(),
- b"rcv" => registers[reg] = rx.recv().unwrap(),
- _ => {}
}
- p += 1;
}
}
+
const ISIZE: usize = include_bytes!("inp.txt").len();
fn main() {
- unsafe { println!("{:?}", p2(include_bytes!("inp.txt"))) };
+ unsafe { println!("{:?}", p1(include_bytes!("inp.txt"))) };
}
#[bench]