Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- declare function require(module:string):any;
- declare var process:any;
- var readline = require('readline');
- var fs = require('fs');
- type brainfuckDone = (char : string) => void;
- type brainfuckInput = (done : brainfuckDone) => void;
- function brainfuck(tokens : string[], inp : brainfuckInput) {
- var heap = [0];
- var pointer = 0;
- var idx = 0;
- function movePointer(diff : number) {
- pointer += diff;
- if (typeof heap[pointer] === 'undefined') {
- heap[pointer] = 0;
- }
- }
- function forwardTo(char : string, recurseString : string) {
- let count = 0;
- for (idx = idx + 1; idx < tokens.length; idx++) {
- let token = tokens[idx];
- if (token === recurseString) {
- count++;
- } else if (token === char) {
- if (count === 0) {
- break;
- } else {
- count--;
- }
- }
- }
- }
- function backTo(char : string, recurseString : string) {
- let count = 0;
- for (idx = idx - 1; idx > 0; idx--) {
- let token = tokens[idx];
- if (token === recurseString) {
- count++;
- } else if (token === char) {
- if (count === 0) {
- break;
- } else {
- count--;
- }
- }
- }
- }
- function next() {
- if (idx < tokens.length) {
- idx++;
- handleToken();
- }
- }
- function handleToken() {
- let token = tokens[idx];
- let shouldNext = true;
- switch (token) {
- case '+':
- heap[pointer]++;
- break;
- case '-':
- heap[pointer]--;
- break;
- case '>':
- movePointer(1);
- break;
- case '<':
- movePointer(-1);
- break;
- case '[':
- if (heap[pointer] === 0) {
- forwardTo(']', '[');
- }
- break;
- case ']':
- if (heap[pointer] !== 0) {
- backTo('[', ']');
- }
- break;
- case '.':
- fs.writeSync(process.stdout.fd, String.fromCharCode(heap[pointer]));
- break;
- case ',':
- inp(str => {
- heap[pointer] = str.charCodeAt(0);
- next();
- });
- shouldNext = false;
- break;
- }
- if (shouldNext) {
- next();
- }
- }
- handleToken();
- }
- brainfuck(`
- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
- +++++++++++++++++++++++++++++.
- +++++++.
- .
- +++.
- -------------------------------------------------------------------.
- ------------.
- +++++++++++++++++++++++++++++++++++++++++++++++++++++++.
- ++++++++++++++++++++++++.
- +++.
- ------.
- --------.
- -------------------------------------------------------------------.
- `.split(''), (done : brainfuckDone) => {
- var rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout
- });
- rl.question("Input [Only One Char] ", function(answer) {
- rl.close();
- done(answer[0]);
- });
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement