47 lines
1.1 KiB
Plaintext
47 lines
1.1 KiB
Plaintext
|
rulesMap(func, rules) =
|
||
|
map(
|
||
|
(x) = func(slice(rules, x, x+5)),
|
||
|
range(0, len(rules), 5)
|
||
|
)
|
||
|
|
||
|
step(tape, rules, state, position) =
|
||
|
char = get(tape, position);
|
||
|
selectedRule = 0;
|
||
|
rulesMap(
|
||
|
(rule) = if(
|
||
|
(get(rule, 0) == state) + (get(rule, 1) == char) == 2,
|
||
|
() = selectedRule = rule
|
||
|
),
|
||
|
rules
|
||
|
);
|
||
|
set(tape, position, get(selectedRule, 3));
|
||
|
moveHead = get(selectedRule, 4);
|
||
|
branch(
|
||
|
moveHead == 2,
|
||
|
() = position = position + 1,
|
||
|
moveHead == 1,
|
||
|
() = position = position - 1,
|
||
|
);
|
||
|
mallocfor(get(selectedRule, 2), position)
|
||
|
|
||
|
|
||
|
rules = mallocfor(
|
||
|
1, ord("0"), 1, ord("1"), 2,
|
||
|
1, ord("1"), 1, ord("0"), 2,
|
||
|
1, ord("*"), 2, ord("*"), 1
|
||
|
)
|
||
|
tape = map(ord, "010011001*")
|
||
|
println("tape was: ", strjoin("", map(chr, tape)))
|
||
|
|
||
|
state = 1
|
||
|
position = 0
|
||
|
while(
|
||
|
() = state != 2,
|
||
|
() =
|
||
|
result = step(tape, rules, state, position);
|
||
|
state = get(result, 0);
|
||
|
position = get(result, 1)
|
||
|
)
|
||
|
|
||
|
println("tape became: ", strjoin("", map(chr, tape)))
|