commit
e958ca6899
@ -0,0 +1,2 @@
|
||||
/target
|
||||
**/*.rs.bk
|
@ -0,0 +1,4 @@
|
||||
[[package]]
|
||||
name = "rsturing"
|
||||
version = "0.1.0"
|
||||
|
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "rsturing"
|
||||
version = "0.1.0"
|
||||
authors = ["Jason Staten <jason.staten@domo.com>"]
|
||||
|
||||
[dependencies]
|
@ -0,0 +1,118 @@
|
||||
type State = usize;
|
||||
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
enum Cell {
|
||||
Blank,
|
||||
Zero,
|
||||
One,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Move {
|
||||
Stay,
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
|
||||
struct Transition {
|
||||
start: State,
|
||||
end: State,
|
||||
read: Cell,
|
||||
write: Cell,
|
||||
operation: Move,
|
||||
}
|
||||
|
||||
struct Machine {
|
||||
initial: State,
|
||||
done: State,
|
||||
transitions: Vec<Transition>,
|
||||
}
|
||||
|
||||
type Tape = Vec<Cell>;
|
||||
|
||||
fn run(machine: Machine, code: Tape) -> Tape {
|
||||
let mut position = 0;
|
||||
let mut state = machine.initial;
|
||||
let mut tape = code.to_vec();
|
||||
tape.resize(10, Cell::Blank);
|
||||
|
||||
while state != machine.done {
|
||||
let transition;
|
||||
{
|
||||
let cell = tape.get(position).unwrap_or(&Cell::Blank);
|
||||
transition = machine
|
||||
.transitions
|
||||
.iter()
|
||||
.find(|t| t.start == state && &t.read == cell)
|
||||
.expect("Missing transition");
|
||||
}
|
||||
state = transition.end;
|
||||
tape[position] = transition.write.clone();
|
||||
position = match transition.operation {
|
||||
Move::Left => position - 1,
|
||||
Move::Right => position + 1,
|
||||
Move::Stay => position,
|
||||
};
|
||||
}
|
||||
|
||||
return tape;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_build() {
|
||||
let machine = Machine {
|
||||
initial: 0,
|
||||
done: 2,
|
||||
transitions: vec![
|
||||
Transition {
|
||||
start: 0,
|
||||
end: 0,
|
||||
read: Cell::Zero,
|
||||
write: Cell::Zero,
|
||||
operation: Move::Right,
|
||||
},
|
||||
Transition {
|
||||
start: 0,
|
||||
end: 0,
|
||||
read: Cell::One,
|
||||
write: Cell::One,
|
||||
operation: Move::Right,
|
||||
},
|
||||
Transition {
|
||||
start: 0,
|
||||
end: 1,
|
||||
read: Cell::Blank,
|
||||
write: Cell::Blank,
|
||||
operation: Move::Left,
|
||||
},
|
||||
Transition {
|
||||
start: 1,
|
||||
end: 1,
|
||||
read: Cell::One,
|
||||
write: Cell::Zero,
|
||||
operation: Move::Left,
|
||||
},
|
||||
Transition {
|
||||
start: 1,
|
||||
end: 2,
|
||||
read: Cell::Zero,
|
||||
write: Cell::One,
|
||||
operation: Move::Stay,
|
||||
},
|
||||
Transition {
|
||||
start: 1,
|
||||
end: 2,
|
||||
read: Cell::Blank,
|
||||
write: Cell::One,
|
||||
operation: Move::Stay,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
let result = run(machine, vec![Cell::One, Cell::One, Cell::Zero, Cell::One]);
|
||||
println!("{:?}", result);
|
||||
|
||||
let mut expected = vec![Cell::One, Cell::One, Cell::One, Cell::Zero];
|
||||
expected.resize(10, Cell::Blank);
|
||||
assert_eq!(result, expected);
|
||||
}
|
Loading…
Reference in new issue