Amtu

From Esolang
Jump to navigation Jump to search

Amtu (derived from the name Alan Mathison Turing) is a cell-based Turing-complete esoteric programming language created by User:TheCanon2. Amtu is designed to be used as notation for Turing machines. Amtu's alphabet consists of three symbols, blank, 0, and 1.

Commands

Lines in Amtu define states of a Turing machine. Lines in Amtu require seven parameters. These parameters can be of any length.

Parameter Execute if the cell of the pointer is
name N/A
action blank
state change blank
action 0
state change 0
action 1
state change 1

Amtu assumes the existence of an infinitely long tape with a single pointer. The action parameters have six commands.

Command Action
< Move the pointer to the left
> Move the pointer to the right
0 Write 0 at the cell of the pointer
1 Write 1 at the cell of the pointer
h Halt the program
= Pass

Since all code written in Amtu is in this format, Amtu can be considered a single-instruction language.

When the Turing machine defined by an Amtu script is executed, Amtu accepts an input at the beginning of a program. The initial tape is all blank unless given an input. The initial state becomes the first state defined in the script. User input must be in the format of (data).(data), the cell before the period becomes the cell of the pointer.

Scripts in Amtu are encoded in ASCII. This detail is only significant when making quines.

Examples

It is important to note that the following examples are not programs, they define programs.

XKCD Random Number

F 0>0>1>1>0>1>0>0h F 0>0>1>1>0>1>0>0h F 0>0>1>1>0>1>0>0h F

Defines a Turing machine that unconditionally writes the character 4 to the tape as binary, since Amtu has no output.

The Turing machine described here

N = S = S 0> N
S 1< S 1< S = N

which can be simplified to:

L 1< L 1< L 0> L

The table shown here

A 1> B 1> B 1< C
B 1> C 1> C 1> B
C 1> D 1> D 0< E
D 1< A 1< A 1< D
E 1>h E 1>h E 0< A

Writing an Amtu script from a table is trivial.

Rule 110

S <<<<<<<<<<<<<<<<<<< R <<<<<<<<<<<<<<<<<<< R <<<<<<<<<<<<<<<<<<< R
R > Z > Z > O
Z > ZZ > ZZ > ZO
O > OZ > OZ > OO
ZZ = W = W = B
ZO = B = B = B
OZ = W = W = B
OO = B = B = W
B >>>>>>>>>>>>>>>>>1>> S >>>>>>>>>>>>>>>>>1> S >>>>>>>>>>>>>>>>>1> S
W >>>>>>>>>>>>>>>>>0>> S >>>>>>>>>>>>>>>>>0> S >>>>>>>>>>>>>>>>>0> S

Defines a 16-cell implementation that leaves behind every generation, given input 0000000000000000__. This script is buggy.

Canon

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

Defines Canon as a Turing machine.

Implementations

The following Python script is an interpreter.

tape = [" "]
for i in range(0, 256): # Change this for expansion
    tape.append(" ")
program = [[0]]
while True:
    line = input('>Amtu ')
    if not line == "eof":
        program.append(list(line.split(" ")))
    else:
        program.pop(0)
        break
init = input('>i ') # Grabs input from user
for i in range(0, len(init)):
    if init[i] == ".":
        init = init.replace('.', '')
        pointer = 128-i # Change this for expansion
        break
for i in range(0, len(init)):
    pointer += 1
    tape[pointer] = init[i]
# done
pointer = 128 # Change this for expansion
line = 0
part = 0
while True:
    part = 0
    if tape[pointer] == " ":
        part = 1
    elif tape[pointer] == "0":
        part = 3
    elif tape[pointer] == "1":
        part = 5
    for inst in range(0, len(program[line][part])):
        cmd = program[line][part][inst]
        if cmd == "<":
            pointer -= 1
        elif cmd == ">":
            pointer += 1
        elif cmd == "0":
            tape[pointer] = "0"
        elif cmd == "1":
            tape[pointer] = "1"
        elif cmd == "h":
            break
        elif cmd == "=":
            pass
        elif cmd == "#": # Debug character
            print(pointer)
            print(tape)
    if cmd == "h":
        break
    else:
        part += 1
        goto = program[line][part]
        line = 0
        while program[line][0] != goto:
            line += 1

Executes the Turing machine defined by a script. The interpreter uses the symbols eof to mark the end of a script and # to display the tape. 256-cell implementation, but it can be expanded.