Add Brainfuck

This commit is contained in:
1computer1 2019-05-22 22:26:55 -04:00
parent 26c667299d
commit 6bd4484fb0
5 changed files with 135 additions and 0 deletions

View file

@ -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++)

View 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
View 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
View file

@ -0,0 +1 @@
bf "$1"

View 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;