diff --git a/README.md b/README.md index 286bb54..4bfada8 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ ## commands ``` +- pop 2 values, push sum/difference (uses the order they are popped, so `0-` negates the top of the stack) +~ logical not (0 becomes 1, nonzero becomes 0) ><^v change direction 0..9 push number to stack /\ pop stack, reflect to the side if not zero diff --git a/src/main.rs b/src/main.rs index 259d4fc..b14e917 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ struct SandWormInterpreter { input_index: usize, output: Vec, state: State, + steps: usize, } #[derive(Debug, Default)] @@ -76,7 +77,7 @@ fn main() { match action.as_slice() { [] | ["step"] => interpreter.step_once(), ["step", num] => _ = num.parse().map(|n| interpreter.step(n)), - // ["run"] => interpreter.run(), + ["run"] => interpreter.run(), ["q" | "exit" | "quit"] => break, _ => println!("{}", "unrecognised command".red()), @@ -101,6 +102,13 @@ impl SandWormInterpreter { state: State::default(), direction: Direction::default(), input_index: 0, + steps: 0, + } + } + + fn run(&mut self) { + while self.state == State::Running { + self.step_once(); } } @@ -114,7 +122,8 @@ impl SandWormInterpreter { } fn show(&self) { - dbg!(&self); + // dbg!(&self); + print!("\x1B[2J"); // clear screen println!( "{:?}", self.worm.iter().map(|p| self.get(*p)).collect::>() @@ -145,6 +154,7 @@ impl SandWormInterpreter { } println!("output: {}", String::from_utf8_lossy(&self.output)); println!("input: {}", String::from_utf8_lossy(&self.input)); + println!("steps: {}", self.steps); } fn step_once(&mut self) { @@ -156,6 +166,7 @@ impl SandWormInterpreter { self.state = State::EndOfProgram; return; } + self.steps += 1; let instruction = self.get(front); let mut dont_push_instruction = false; @@ -202,6 +213,10 @@ impl SandWormInterpreter { let last_val = self.worm.last().map(|&p| self.get(p)).unwrap_or_default(); self.worm_in.push(last_val); } + b'~' => { + let last_val = self.shrink(); + self.worm_in.push((last_val == 0) as u8); + } b'\\' => { let val = self.shrink(); if val != 0 {