82 lines
2.1 KiB
Text
82 lines
2.1 KiB
Text
F run_utm(halt, state, Char blank; rules_in, [Char] &tape = [Char](); =pos = 0)
|
||
V st = state
|
||
I tape.empty
|
||
tape.append(blank)
|
||
I pos < 0
|
||
pos += tape.len
|
||
V rules = Dict(rules_in, r -> ((r[0], Char(string' r[1])), (Char(string' r[2]), r[3], r[4])))
|
||
|
||
L
|
||
print(st.ljust(4), end' ‘ ’)
|
||
L(v) tape
|
||
V i = L.index
|
||
I i == pos
|
||
print(‘[’v‘]’, end' ‘ ’)
|
||
E
|
||
print(v, end' ‘ ’)
|
||
print()
|
||
|
||
I st == halt
|
||
L.break
|
||
I (st, tape[pos]) !C rules
|
||
L.break
|
||
|
||
V (v1, dr, s1) = rules[(st, tape[pos])]
|
||
tape[pos] = v1
|
||
I dr == ‘left’
|
||
I pos > 0
|
||
pos--
|
||
E
|
||
tape.insert(0, blank)
|
||
I dr == ‘right’
|
||
pos++
|
||
I pos >= tape.len
|
||
tape.append(blank)
|
||
st = s1
|
||
|
||
print("incr machine\n")
|
||
run_utm(
|
||
halt' ‘qf’,
|
||
state' ‘q0’,
|
||
blank' Char(‘B’),
|
||
rules_in' [‘q0 1 1 right q0’.split_sg(),
|
||
‘q0 B 1 stay qf’.split_sg()],
|
||
tape' &[‘1’, ‘1’, ‘1’]
|
||
)
|
||
|
||
print("\nbusy beaver\n")
|
||
run_utm(
|
||
halt' ‘halt’,
|
||
state' ‘a’,
|
||
blank' Char(‘0’),
|
||
rules_in'
|
||
[‘a 0 1 right b’.split_sg(),
|
||
‘a 1 1 left c’.split_sg(),
|
||
‘b 0 1 left a’.split_sg(),
|
||
‘b 1 1 right b’.split_sg(),
|
||
‘c 0 1 left b’.split_sg(),
|
||
‘c 1 1 stay halt’.split_sg()]
|
||
)
|
||
|
||
print("\nsorting test\n")
|
||
run_utm(
|
||
halt' ‘STOP’,
|
||
state' ‘A’,
|
||
blank' Char(‘0’),
|
||
rules_in'
|
||
[‘A 1 1 right A’.split_sg(),
|
||
‘A 2 3 right B’.split_sg(),
|
||
‘A 0 0 left E’.split_sg(),
|
||
‘B 1 1 right B’.split_sg(),
|
||
‘B 2 2 right B’.split_sg(),
|
||
‘B 0 0 left C’.split_sg(),
|
||
‘C 1 2 left D’.split_sg(),
|
||
‘C 2 2 left C’.split_sg(),
|
||
‘C 3 2 left E’.split_sg(),
|
||
‘D 1 1 left D’.split_sg(),
|
||
‘D 2 2 left D’.split_sg(),
|
||
‘D 3 1 right A’.split_sg(),
|
||
‘E 1 1 left E’.split_sg(),
|
||
‘E 0 0 right STOP’.split_sg()],
|
||
tape' &‘2 2 2 1 2 2 1 2 1 2 1 2 1 2’.split(‘ ’).map(Char)
|
||
)
|