We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

Canon

From Esolang
(Redirected from Rule 108)
Jump to navigation Jump to search
"Rule 108" redirects here. For the elementary cellular automaton, see Rule 108.

Canon is a one-dimensional cellular automaton created by User:TheCanon2.

Rules

Canon has a single pointer. The pointed moves based on the value of the pointer cell b and its neighbours a and c. Canon has four rules.

  • If a = c != b, flip b and move the pointer two cells to the left.
  • If a = b = c, flip b and move the pointer one cell to the left.
  • If a != c and b = 1, flip b and move the pointer two cells to the right.
  • If a != c and b = 0, flip b and move the pointer one cell to the right.

Implementations

The following Amtu script defines Canon as a Turing machine.

A < R < R < R
R > Z > Z > O
Z > ZZ > ZZ > ZO
O > OZ > OZ > OO
ZZ <1< A <1< A <1>> A
ZO <0<< A <0<< A <0> A
OZ <1>> A <1<< A <1<< A
OO <0> A <0> A <0< A

The following Python script performs Canon.

tape = [0] # Canon
import random
for i in range(0, 60):
    tape.append(random.randint(0, 1)) # Replace with 0 for blank input
pointer = 30
while True:
    subtape = [tape[pointer-1],tape[pointer],tape[pointer+1]]
    if subtape == [0, 0, 0]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer -= 1
    elif subtape == [0, 0, 1]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer += 2
    elif subtape == [0, 1, 0]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer -= 2
    elif subtape == [0, 1, 1]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer += 1
    elif subtape == [1, 0, 0]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer += 2
    elif subtape == [1, 0, 1]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer -= 2
    elif subtape == [1, 1, 0]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer += 1
    elif subtape == [1, 1, 1]:
        tape[pointer] = (tape[pointer] + 1) % 2
        pointer -= 1
    for i in range(0, len(tape)):
        print(tape[i], end="")
    print("\n", end="")