Add Brainfuck
This commit is contained in:
parent
26c667299d
commit
6bd4484fb0
5 changed files with 135 additions and 0 deletions
|
@ -66,6 +66,7 @@ One of the following language codes is set in `lang`.
|
|||
Options are optionally set in `options`, which is a semicolon-delimited list of `flag` or `flag=value`.
|
||||
|
||||
- `bash` Bash
|
||||
- `bf` Brainfuck
|
||||
- `c` C (GCC)
|
||||
- `clj` Clojure
|
||||
- `cpp` C++ (G++)
|
||||
|
|
12
docker/brainfuck/Dockerfile
Normal file
12
docker/brainfuck/Dockerfile
Normal file
|
@ -0,0 +1,12 @@
|
|||
FROM alpine AS build
|
||||
|
||||
RUN apk update && apk add g++
|
||||
COPY bf.cpp .
|
||||
RUN g++ bf.cpp -o bf
|
||||
|
||||
FROM alpine
|
||||
LABEL author="1Computer1"
|
||||
|
||||
RUN apk update && apk add libstdc++
|
||||
COPY --from=build bf /usr/local/bin/
|
||||
COPY run.sh /var/run/
|
109
docker/brainfuck/bf.cpp
Normal file
109
docker/brainfuck/bf.cpp
Normal file
|
@ -0,0 +1,109 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc == 1) {
|
||||
std::cerr << "No input given";
|
||||
return 1;
|
||||
}
|
||||
|
||||
char* ops = argv[1];
|
||||
std::vector<char> tape = { 0 };
|
||||
int oix = 0;
|
||||
int tix = 0;
|
||||
int len = strlen(ops);
|
||||
while (oix < len) {
|
||||
switch (ops[oix]) {
|
||||
case '>':
|
||||
tix++;
|
||||
if (tix >= tape.size()) {
|
||||
tape.push_back(0);
|
||||
}
|
||||
|
||||
oix++;
|
||||
break;
|
||||
case '<':
|
||||
tix--;
|
||||
if (tix < 0) {
|
||||
std::cerr << "Out of bounds";
|
||||
return 1;
|
||||
}
|
||||
|
||||
oix++;
|
||||
break;
|
||||
case '+':
|
||||
tape[tix]++;
|
||||
oix++;
|
||||
break;
|
||||
case '-':
|
||||
tape[tix]--;
|
||||
oix++;
|
||||
break;
|
||||
case '.':
|
||||
std::cout << tape[tix];
|
||||
oix++;
|
||||
break;
|
||||
case ',':
|
||||
std::cin >> tape[tix];
|
||||
oix++;
|
||||
break;
|
||||
case '[':
|
||||
if (tape[tix] == 0) {
|
||||
int ls = 0;
|
||||
int rs = 0;
|
||||
for (int i = oix; i < len; i++) {
|
||||
switch (ops[i]) {
|
||||
case '[':
|
||||
ls++;
|
||||
break;
|
||||
case ']':
|
||||
rs++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (ls == rs) {
|
||||
oix = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
oix++;
|
||||
}
|
||||
|
||||
break;
|
||||
case ']':
|
||||
if (tape[tix] != 0) {
|
||||
int ls = 0;
|
||||
int rs = 0;
|
||||
for (int i = oix; i >= 0; i--) {
|
||||
switch (ops[i]) {
|
||||
case '[':
|
||||
ls++;
|
||||
break;
|
||||
case ']':
|
||||
rs++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (ls == rs) {
|
||||
oix = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
oix++;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
oix++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
1
docker/brainfuck/run.sh
Normal file
1
docker/brainfuck/run.sh
Normal file
|
@ -0,0 +1 @@
|
|||
bf "$1"
|
12
src/languages/brainfuck.js
Normal file
12
src/languages/brainfuck.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
const Language = require('../struct/Language');
|
||||
|
||||
class Brainfuck extends Language {
|
||||
constructor() {
|
||||
super('brainfuck', {
|
||||
name: 'Brainfuck',
|
||||
aliases: ['brainfuck', 'bf']
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Brainfuck;
|
Loading…
Reference in a new issue