Update
This commit is contained in:
parent
2897818490
commit
f96124b085
3 changed files with 67 additions and 5 deletions
66
brainfuck.md
66
brainfuck.md
|
@ -8,7 +8,7 @@ The language is based on a 1964 language P´´ which was published in a mathemat
|
|||
|
||||
Brainfuck has seen tremendous success in the [esolang](esolang.md) community as the **lowest common denominator language**: just as mathematicians use [Turing machines](turing_machine.md) in proofs, esolang programmers use brainfuck in similar ways -- many esolangs just compile to brainfuck or use brainfuck in proofs of [Turing completeness](turing_complete.md) etc. This is thanks to brainfuck being an actual, implemented and working language reflecting real computers, not just a highly abstract mathematical model with many different variants. For example if one wants to encode a program as an integer number, we can simply take the binary representation of the program's brainfuck implementation.
|
||||
|
||||
In [LRS](lrs.md) program brainfuck may be seriously used as a super simple [scripting language](script.md).
|
||||
In [LRS](lrs.md) programs brainfuck may be seriously used as a super simple [scripting language](script.md).
|
||||
|
||||
## Specification
|
||||
|
||||
|
@ -23,10 +23,70 @@ A program consists of these possible commands:
|
|||
- `>`: move the data pointer to the right
|
||||
- `<`: move the data pointer to the left
|
||||
- `[`: jump after corresponding `]` if value under data pointer is zero
|
||||
- `]`: jump after corresponding `[` if value under data pointer is zero
|
||||
- `]`: jump after corresponding `[` if value under data pointer is not zero
|
||||
- `.`: output value under data pointer as an ASCII character
|
||||
- `,`: read value and store it to the cell under data pointer
|
||||
|
||||
## Variations
|
||||
## Implementation
|
||||
|
||||
This is a very simple [C](c.md) implementation of brainfuck:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
|
||||
#define CELLS 30000
|
||||
|
||||
const char program[] = ",[.-]"; // your program here
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char tape[CELLS];
|
||||
unsigned int cell = 0;
|
||||
const char *i = program;
|
||||
int bDir, bCount;
|
||||
|
||||
while (*i != 0)
|
||||
{
|
||||
switch (*i)
|
||||
{
|
||||
case '>': cell++; break;
|
||||
case '<': cell--; break;
|
||||
case '+': tape[cell]++; break;
|
||||
case '-': tape[cell]--; break;
|
||||
case '.': putchar(tape[cell]); fflush(stdout); break;
|
||||
case ',': scanf("%c",tape + cell); break;
|
||||
case '[':
|
||||
case ']':
|
||||
if ((tape[cell] == 0) == (*i == ']'))
|
||||
break;
|
||||
|
||||
bDir = (*i == '[') ? 1 : -1;
|
||||
bCount = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (*i == '[')
|
||||
bCount += bDir;
|
||||
else if (*i == ']')
|
||||
bCount -= bDir;
|
||||
|
||||
if (bCount == 0)
|
||||
break;
|
||||
|
||||
i += bDir;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Variants
|
||||
|
||||
TODO
|
Loading…
Add table
Add a link
Reference in a new issue