# The Maze

**The Maze** is a programming language made in 2022 by User:LEOMOK. It is a 2D esolang inspired by Maze, Mice in a maze and Gerbil.

## Concept and commands

There are three kinds of instruction pointers - mice, dogs and cats. When two mice of opposite genders meet, two turns later, a male baby and a female baby will be born. Dogs and cats do not reproduce or grow, but any one of them that does not eat a mouse for five turns will die. Any creature that dies will leave its dead body. If a tile has a dead body, it will not be executed until the body is removed.

The physics is the same as Mice in a maze.

Each creature has its own floating-point stack, but there is also a global stack.

### Commands

When I say 'the stack', I mean the local stack. All commands push error code and kill creature on error. Creatures to be placed

M - places a newborn male mouse F - places a newborn female mouse P - places a dog C - places a cat

Types of walls/obstacles

W, X, Y, Z - Blocks everything, mice only, dogs only and cats only respectively. w, x, y, z - Same as above, but only blocks creatures with a nonzero value on top of their stack. H, V - Blocks all creatures coming horizontally and vertically respectively. h, v - Same as above, but only blocks if top of stack is nonzero. ` - When passed through, becomes a wall. Forever. (Who uses that key anyway?)

Movement

( - move clockwise ) - move counterclockwise K - poison that kills anything stepping over it. k - this poison only kills mice. <, >, ^, ~ - forces creature to move right/left/forward/backward. \ - Reflect. & - Random direction. @ - Skip next instruction. # - clears all dead bodies adjacent to this tile. | - Pop x and y, teleport to (x, y).

Literals

12.4 - Any consecutive string of digits and decimal point is pushed to the stack as a floating-point number ' - Pushes the unicode of the next character. " - String mode. Pushes the unicode of every character until the next ", reversed for easy printing.

Operators

+ - Pop a, b, push b+a. - - Pop a, b, push b-a. * - Pop a, b, push b*a. , - Pop a, b, push b/a (float division). % - Pop a, b, push b%a (remainder). : - Pop a, b, push b to the power of a. ; - Pop a, b, push log base b of a. _ - Pop a, push -a. ! - Pop a, b, push 1 if 0 and 0 otherwise. = - Pop a, b, push 1 if b=a, 0 otherwise. [ - Pop a, b, push 1 if b<a, 0 otherwise. ] - Pop a, b, push 1 if b>a, 0 otherwise. { - Pop a, b, push null-terminated string representation of a in base b. } - Pop string s and integer b, parse s to floating-point number in base b. ? - Push random floating-point number from 0 to 1.

Input and output

I - input character and push. -1 on EOF. i - input number and push. 0 on EOF. O - output character and pop. o - output number and pop.

Stack operations

D - duplicate top of stack. d - Pop x, y, push x y times. (default 2) S - swap top two items. s - Pop x, reverse top x items (default the whole stack) G - Pop and discard. g - Pop x, discard the top x items (default the whole stack again) U - Over. Duplicate the second stack item. u - Pop x, duplicate the nth stack item. (default the bottom) R - Rotate top three items clockwise (x, y, z -- y, z, x) r - Rotate top three items counterclockwise (x, y, z -- z, x, y) L - Push the length of the stack. l - Clear the stack. T - Move top value down. t - Move bottom value up. N - Pop from the local stack to be pushed to the global stack. n - Pop from the global stack to be pushed to the local stack. Q - Stops the next command from popping the stack. q - Stops commands from popping the stack until another q is found.

Others

A - Put. Pop x, y, z, set command at (x, y) to z. a - Get. Pop x, y, push value of command at (x, y). Empty cells are equal to 0.

## Examples

WWWWWWWWWWWWWWWWWWWWWW WM0"Hello World!"`OwKW WWWWWWWWWWWWWWWWWWWWWW

Fibonacci (Warning - infinite loop!)

WWWWWWWWWWWW WM1 0`Q+Do~W WWWWWW WWW W WWWWWW W WWWWWWWWWWWW