&brainfuck
&brainfuck (pronounced "reference brainfuck") is a brainfuck variant discovered by User:Orby in May of 2020.
Model
&brainfuck uses a right-unbounded tape of unbounded non-negative cells. Decrementing a data pointer that is zero, decrementing a cell that is zero, and decrementing an indirection level that is zero all produce undefined behavior.
Commands
| Command | Action |
|---|---|
| > | Increment the data pointer |
| < | Decrement the data pointer |
| * | Increment the level of indirection |
| & | Decrement the level of indirection |
| [ | If the cell pointed to by the data pointer is zero, jump after matching ] |
| ] | If the cell pointed to by the data pointer is non-zero, jump after matching [ |
The level of indirection begins at zero. At this point all commands behave normally. When the level of indirection is one, > becomes "Increment the cell pointed to by the data pointer". When the level of indirection is two, > becomes "Increment the cell pointed to by the cell pointed to by the data pointer", and so on. Therefore, + can be represented as *>& and - can be represented as *<&. Notice that [ and ] inherently contain one level of indirection, but their level of indirection is also increased with * and decreased with &.
Reversible variant
A reversible variant of &brainfuck can be achieved by altering the loop construct.
| Command | Action |
|---|---|
| [ | If the cell pointed to by the data pointer is zero, jump after matching ] |
| ] | If the cell pointed to by the data pointer is zero, jump after matching [ |
To compute the inverse of a program, simply reverse the program string and replace characters according to the following table
| Command | Inverse |
|---|---|
| > | < |
| < | > |
| * | & |
| & | * |
| [ | ] |
| ] | [ |
Converting from brainfuck
Brainfuck programs can trivially be converted to &brainfuck programs, but the converse is not true.
| bf | &bf |
|---|---|
| > | > |
| < | < |
| + | *>& |
| - | *<& |
| [ | [ |
| ] | ] |
See also
- *brainfuck
- brainfuck
- Befinde
- Symbolic Brainfuck
- Git for reference implementation in C.
- Git branch for Rust implementation with absolute addressing