// Welcome to Christopher!
//
// Christopher is a Turing machine
// simulator. You program it with a
// language designed specifically
// for it called Tlang. Here's an
// example program that increments
// in binary:
main | * | R -> move
move | 1 | R -> move
move | 0 | R -> move
move | | L -> flip
flip | 0 | P(1) R -> move
flip | 1 | P(0) L -> flip
flip | | P(1) R -> move
// All programs start in state "main".
// You have access to 4 instructions:
//
// - R moves the tape head right
// - L moves the tape head left
// - P(x) prints x to the tape
// - H halts the machine
//
// Then -> moves to the next state.
// If no -> is found on a line, it
// is assumed you wish to halt.
// If you're not familiar with Turing
// machines, I recommend you read the
// article I wrote about them:
// https://samwho.dev/turing-machines
//
// I use this simulator heavily in the
// article, and anything it can do there
// you can do here.
//
// I love to hear from folks who have
// used my work in their own projects or
// education. If this is you, please
// reach out and say hi! My email is
// hello@samwho.dev.
//
// Have fun!
main | * | P(1) R P(1) R P(0) R R P(0) R P(1) R P(1) L L L L L L -> b1
b1 | 0 | R -> b1
b1 | 1 | R -> b1
b1 | | R -> b2
b2 | 0 | R -> b2
b2 | 1 | R -> b2
b2 | | L -> dec
dec | 0 | P(1) L -> dec
dec | 1 | P(0) L -> b3
dec | | H
b3 | 0 | L -> b3
b3 | 1 | L -> b3
b3 | | L -> inc
inc | 0 | P(1) R -> b1
inc | 1 | P(0) L -> inc
inc | | P(1) R -> b1
main | * | R -> move
move | 1 | R -> move
move | 0 | R -> move
move | | L -> flip
flip | 0 | P(1) R -> move
flip | 1 | P(0) L -> flip
flip | | P(1) R -> move
main | * | R -> inc
inc | 0 | P(1) -> back
inc | 1 | P(2) -> back
inc | 2 | P(3) -> back
inc | 3 | P(4) -> back
inc | 4 | P(5) -> back
inc | 5 | P(6) -> back
inc | 6 | P(7) -> back
inc | 7 | P(8) -> back
inc | 8 | P(9) -> back
inc | 9 | P(0) L -> inc
inc | | P(1) -> back
back | | L -> inc
back | * | R -> back
main | * | R R P(0) R P(1) R P(0) R -> initb
initb | * | R P(0) R P(1) R P(1) R -> start
start | * | L -> start
start | H | R -> go_a
go_a | * | R -> go_a
go_a | A | R R R -> dec_a
dec_a | 0 | P(1) L -> cry_a
dec_a | 1 | P(0) -> go_c1
cry_a | 0 | P(1) L -> cry_a
cry_a | 1 | P(0) -> go_c1
cry_a | * | R P(0) R P(0) R P(0) -> goto_b
go_c1 | * | R -> go_c1
go_c1 | C | R R R -> inc_c1
inc_c1 | 0 | P(1) -> h2a
inc_c1 | 1 | P(0) L -> cry_ca
cry_ca | 0 | P(1) -> h2a
cry_ca | 1 | P(0) L -> cry_ca
cry_ca | * | R -> h2a
h2a | * | L -> h2a
h2a | H | R -> go_a
goto_b | * | R -> goto_b
goto_b | B | R R R -> dec_b
dec_b | 0 | P(1) L -> dec_bc
dec_b | 1 | P(0) -> go_c2
dec_bc | 0 | P(1) L -> dec_bc
dec_bc | 1 | P(0) -> go_c2
dec_bc | * | R P(0) R P(0) R P(0) -> end
go_c2 | * | R -> go_c2
go_c2 | C | R R R -> inc_c2
inc_c2 | 0 | P(1) -> go_hb
inc_c2 | 1 | P(0) L -> cry_cb
cry_cb | 0 | P(1) -> go_hb
cry_cb | 1 | P(0) L -> cry_cb
cry_cb | * | R -> go_hb
go_hb | * | L -> go_hb
go_hb | H | R -> goto_b
end | * | L -> end
end | H | H