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`.
|
Options are optionally set in `options`, which is a semicolon-delimited list of `flag` or `flag=value`.
|
||||||
|
|
||||||
- `bash` Bash
|
- `bash` Bash
|
||||||
|
- `bf` Brainfuck
|
||||||
- `c` C (GCC)
|
- `c` C (GCC)
|
||||||
- `clj` Clojure
|
- `clj` Clojure
|
||||||
- `cpp` C++ (G++)
|
- `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