heh
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 112 |
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] |