Skip to content

Instantly share code, notes, and snippets.

@nathggns
Created June 7, 2015 04:24
Show Gist options
  • Save nathggns/7ccf21d90f4e7c1af7db to your computer and use it in GitHub Desktop.
Save nathggns/7ccf21d90f4e7c1af7db to your computer and use it in GitHub Desktop.
brainfuck in typescript
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]);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment