Maze
Maze is a programming language based on variables that move over instructions. Each Variable is called a Car. Their passage is guided by walls and other controls.
Syntax
Maze controls
| Symbol | Description |
|---|---|
##
|
Wall. Cars will not pass through these. |
..
|
Path. Cars will follow these. |
,
|
Separator. Put this after every command (except at end of line.) |
<>
|
Splitter. Create a new thread. |
42
|
Any two-digit numeral. Pause the car for this amount of 'ticks'. |
^^
|
Start. One per maze only. |
()
|
Hole. Kill cars. |
>>
|
Print. Output the value held by the car. |
<<
|
Grab. Input a value. |
--
|
Will turn into a wall after being run over. |
%L, %R, %D, %U
|
Directions. Force the car to go Left, Right, Down or Up. |
**
|
Signal. See below. |
AA
|
Any two letters. A function to be applied to the car. |
Function commands
| Command | Description |
|---|---|
=
|
Make equal to. Assign a new value to the car. |
-=
|
Subtracts a value from the car and store the result in the car. |
+=
|
Addition. Similar to -=
|
*=
|
Multiplication. Similar to -=
|
/=
|
Division. Similar to -=
|
<=, ==, >=, >, <
|
Comparative statements. |
%L, %R, %D, %U
|
Directions. Force the car to go Left, Right, Down or Up. |
**
|
Signal statement. Return true if there exists a signal in the maze that has a car on it, false otherwise. |
IF condition
|
Conditional branch statement. |
//
|
Comment. Ignore the rest of the line. |
->
|
Define. Assign a function to a function name. |
Functions are defined by putting 2 letters in the maze in the path of the car. The code for the function follows the maze. Example:
AA-> ="Hello" //Make car equal Hello AB-> IF ** THEN %U ELSE %D //If there is a signal in the maze with a car on it, the car will go UP. If not, it will go down. AC-> -=30 //Subtract 30 from value of car
Timing:
Every 'Tick', every car will move 1 step.
Examples
Hello World
##,##,## ##,^^,## //Car Starts ##,AA,## //Do AA to Car ##,>>,## //Print Car ##,(),## //Destroy Car ##,##,## AA-> ="Hello World!"
99 bottles of beer
##,##,##,##,##,##,##,##,##,##,##,##,## ##,##,##,##,##,^^,##,##,##,##,##,##,## //Start Car ##,##,##,##,..,<>,..,..,##,##,##,##,## //Make New Car ##,..,..,..,..,##,##,..,##,##,##,##,## ##,..,##,##,##,..,..,<>,..,..,##,##,## //Make New Car ##,AA,##,##,##,AB,##,##,##,AC,##,##,## //Set Values of Cars ##,%D,..,..,##,%D,..,..,##,%D,..,..,## //Make sure car goes down ##,>>,##,..,##,..,##,..,##,..,##,..,## //Printing... ##,..,##,>>,##,>>,##,>>,##,..,##,AC,## ##,>>,##,..,##,..,##,..,##,..,##,>>,## ##,..,##,..,##,..,##,..,##,>>,##,AF,## ##,AD,**,AG,##,..,AE,..,##,..,AE,..,## //Have we got to one? ##,(),##,##,##,##,(),##,##,##,(),##,## //Destroy Cars ##,##,##,##,##,##,##,##,##,##,##,##,## AA-> =99 AB-> ="Bottles of Beer on the wall," AC-> ="Bottles of Beer\n" AD-> IF == 1 THEN %D ELSE %R AE-> IF ** THEN %R ELSE %D AF-> ="You Take one down, Pass it around," AG-> -= 1
Truth-machine
##,##,##,##,##,##,## ##,##,##,^^,##,##,## ##,##,##,<<,##,##,## ##,(),>>,AA,>>,..,## ##,##,##,..,##,..,## ##,##,##,..,..,..,## ##,##,##,##,##,##,## AA-> IF ==0 THEN %L ELSE %R
Fibonacci sequence
This program works in the Python interpreter below.
##,##,## // fibonacci
##,##,^^,##,##
##,..,<>,PP,##
##,..,##,..,##,##,##,##,##,##,##,## // left column is fib(n), right column is fib(n+1).
##,##,##,##,##,%D,..,LD,..,**,..,..,..,..,..,## // the small left loop sets fib(n) to 0; simultaneously,
##,..,..,..,##,>>,##,..,## ##,##,##,##,##,..,## // the small right loop sets a clone of fib(n+1) to fib(n+1)+f(n).
##,MM,##,..,##,..,##,..,##,##,..,..,..,##,..,## // (this technique is similar to brainfuck [->+<])
##,..,**,FL,..,02,##,%R,..,##,..,##,PP,##,..,## // the small loop at the bottom does nothing, but make sure
##,##,##,NL,##,##,##,%D,<>,01,FR,..,..,##,..,## // that the original fib(n+1) is synchronized with the other cars.
##,>>,##,##,##,..,##,##,03,##,##,##,..,## // then fib(n+1) goes to left column and fib(n+1)+fib(n) to right column
##,(),##,..,..,FM,..,..,%R,..,..,..,..,##
##,##,##,..,##,..,##,##,##,##,##,##,##,##
##,..,..,..,##
##,##,##,##,##
PP-> +=1
MM-> -=1
FR-> IF ** THEN %U ELSE %D
FL-> IF ==0 THEN %D ELSE %L
FM-> IF ** THEN %L ELSE %R
LD-> IF ** THEN %L ELSE %D
NL-> ="\n"
Computational class
Let's show that Maze is Turing complete, via reduction from 3-cell brainfuck +-><[], which is known to be Turing complete.
(See Collatz function for a proof that 3-cell brainfuck is Turing complete.)
Any 3-cell brainfuck program is equivalent to the following Maze program:
- Begin the Maze program with the code:
##,##,##,##,##,##,##
##,##,^^,##,##,##,##
##,..,<>,%R,..,##,##
##,02,##,%D,<>,..,##
##,..,##,..,##,..,##
- Translate brainfuck instructions into Maze, one instruction per line, as follow:
##,..,##,..,##,PP,## // +
##,..,##,..,##,MM,## // -
##,%D,..,%L,##,..,## // >
##,**,##,%D,..,..,##
##,..,##,..,##,##,##
##,SW,01,SW,..,..,##
##,..,##,**,##,..,##
##,03,##,03,##,..,##
##,..,##,%R,..,%D,## // <
##,..,..,%D,##,**,##
##,##,##,..,##,..,##
##,..,..,WS,01,WS,##
##,..,##,**,##,..,##
##,..,##,03,##,03,##
##,##,##,##,##,##,##,##,..,##,..,##,..,## // [
##,..,..,..,..,..,..,..,SW,..,SW,..,%D,##
##,..,##,##,##,##,##,##,..,##,..,##,..,##
##,..,##,..,..,..,..,..,SW,..,%D,##,..,##
##,..,##,..,##,##,##,##,..,##,..,##,..,##
##,..,##,..,##,..,..,..,%D,##,..,##,..,##
##,..,##,..,##,**,##,##,..,##,..,##,..,##
##,..,##,..,##,..,##,##,..,##,..,##,..,##
##,..,##,..,##,**,##,##,..,##,..,##,..,##,##,##,##,##,##,##,##
##,..,##,..,##,..,##,##,..,##,..,##,LO,..,**,..,**,..,**,..,##
##,..,##,..,##,**,##,##,..,##,..,##,..,##,##,##,##,##,##,**,##
##,..,##,08,##,16,##,##,..,##,SW,..,SW,..,..,..,..,..,##,..,##
##,..,##,..,##,..,##,##,..,##,..,##,..,##,##,##,##,..,##,..,##
##,..,##,..,##,..,##,##,SW,..,SW,..,SW,..,..,..,##,..,##,..,##
##,..,##,..,##,..,##,##,..,##,..,##,..,##,##,..,##,..,##,..,##
##,..,##,08,##,16,##,##,..,##,..,##,..,##,##,..,##,..,##,..,## // ]
##,..,##,..,##,..,..,..,..,##,..,##,..,##,##,..,##,..,##,..,##
##,..,##,..,##,##,##,##,##,##,..,##,..,##,##,..,##,..,##,..,##
##,..,##,..,..,..,..,..,..,..,..,##,..,##,##,..,##,..,##,..,##
##,..,##,##,##,##,##,##,##,##,##,##,..,##,##,..,##,..,##,..,##
##,..,..,..,..,..,..,..,..,..,..,..,..,##,##,..,##,..,##,..,##
##,##,##,##,##,##,##,##,##,##,##,##,##,##,##,..,##,..,##,..,##
##,..,..,..,..,..,..,..,..,##,..,##,..,##
##,..,##,##,##,##,##,##,##,##,..,##,..,##
##,..,##,..,..,..,..,..,..,..,..,##,..,##
##,..,##,..,##,##,##,##,##,##,##,##,..,##
##,..,##,..,##,..,..,..,..,..,..,..,..,##
##,..,##,..,##,..,##,##,##,##,##,##,##,##
- Append to the end of the program the code:
##,(),##,(),##,(),##
##,##,##,##,##,##,##
PP-> +=1
MM-> -=1
SW-> IF ** THEN %R ELSE %D
WS-> IF ** THEN %L ELSE %D
LO-> IF ==0 THEN %R ELSE %D
How it works:
When the program begins, three cars are created, each representing a brainfuck cell. The cars travel on three parallel routes; the car in the rightmost route is the "current" cell. Instructions + and - increment and decrement that car's value. Instructions > and < make the cars swap routes: the car matching the "new current cell" comes to the rightmost route and the other two follow accordingly. Instruction [ spawn three new routes, leading to the matching ]. Nested loops are not an issue, as long as extra routes from outer loops are moved to the right to get round inner routes. Similarly, ] spawn three routes that lead back to the matching [. Needless to say, all those peripheral routes must be continued in the body of the loop, parallel to the three main routes.
External resources
- A C++ Maze interpreter
- A Python Maze interpreter