Compare commits

..

2 commits

Author SHA1 Message Date
dc2e3bc106 add 99 bottles of beer example program 2023-12-16 23:17:01 +01:00
4b0444e979 add logical not operator 2023-12-16 23:16:23 +01:00
3 changed files with 23 additions and 2 deletions

View file

@ -8,6 +8,7 @@
## commands ## commands
``` ```
+- pop 2 values, push sum/difference (uses the order they are popped, so `0-` negates the top of the stack) +- 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 ><^v change direction
0..9 push number to stack 0..9 push number to stack
/\ pop stack, reflect to the side if not zero /\ pop stack, reflect to the side if not zero

View file

@ -0,0 +1,5 @@
v00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@<
>6=+=+=+=+3+v>!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^
v <^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!_of_beer_on_the_wall=+55-:9_bottle_of_beer_on_the_wall+55-:9_bottle_of_beer+55Take_one_down,_pass_it_around+55No_bottles_of_beer_on_the_wall<
> 1v
\11!!!!!!!!!!!!!!!!!!!!!!!s_of_beer_on_the_wall=+55/~+-01=!!!!!!!_bottle"=+-01!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!_bottles_of_beer+55Take_one_down,_pass_it_around+55"=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!_bottles_of_beer_on_the_wall+55"=/

View file

@ -18,6 +18,7 @@ struct SandWormInterpreter {
input_index: usize, input_index: usize,
output: Vec<u8>, output: Vec<u8>,
state: State, state: State,
steps: usize,
} }
#[derive(Debug, Default)] #[derive(Debug, Default)]
@ -76,7 +77,7 @@ fn main() {
match action.as_slice() { match action.as_slice() {
[] | ["step"] => interpreter.step_once(), [] | ["step"] => interpreter.step_once(),
["step", num] => _ = num.parse().map(|n| interpreter.step(n)), ["step", num] => _ = num.parse().map(|n| interpreter.step(n)),
// ["run"] => interpreter.run(), ["run"] => interpreter.run(),
["q" | "exit" | "quit"] => break, ["q" | "exit" | "quit"] => break,
_ => println!("{}", "unrecognised command".red()), _ => println!("{}", "unrecognised command".red()),
@ -101,6 +102,13 @@ impl SandWormInterpreter {
state: State::default(), state: State::default(),
direction: Direction::default(), direction: Direction::default(),
input_index: 0, 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) { fn show(&self) {
dbg!(&self); // dbg!(&self);
print!("\x1B[2J"); // clear screen
println!( println!(
"{:?}", "{:?}",
self.worm.iter().map(|p| self.get(*p)).collect::<Vec<_>>() self.worm.iter().map(|p| self.get(*p)).collect::<Vec<_>>()
@ -145,6 +154,7 @@ impl SandWormInterpreter {
} }
println!("output: {}", String::from_utf8_lossy(&self.output)); println!("output: {}", String::from_utf8_lossy(&self.output));
println!("input: {}", String::from_utf8_lossy(&self.input)); println!("input: {}", String::from_utf8_lossy(&self.input));
println!("steps: {}", self.steps);
} }
fn step_once(&mut self) { fn step_once(&mut self) {
@ -156,6 +166,7 @@ impl SandWormInterpreter {
self.state = State::EndOfProgram; self.state = State::EndOfProgram;
return; return;
} }
self.steps += 1;
let instruction = self.get(front); let instruction = self.get(front);
let mut dont_push_instruction = false; 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(); let last_val = self.worm.last().map(|&p| self.get(p)).unwrap_or_default();
self.worm_in.push(last_val); self.worm_in.push(last_val);
} }
b'~' => {
let last_val = self.shrink();
self.worm_in.push((last_val == 0) as u8);
}
b'\\' => { b'\\' => {
let val = self.shrink(); let val = self.shrink();
if val != 0 { if val != 0 {