Skip to content

Instantly share code, notes, and snippets.

@leomastoras
Last active April 14, 2024 10:11
Show Gist options
  • Save leomastoras/ab94904806ad698f301ee61b20bcfa7b to your computer and use it in GitHub Desktop.
Save leomastoras/ab94904806ad698f301ee61b20bcfa7b to your computer and use it in GitHub Desktop.
Brainfuck interpretter written in Javascript
// fmb = F**K My Brain
// ins = instructions string
// oup = terminal output callback function
// inp = terminal input callback function
function fmb(ins, oup, inp) {
var m = [], dp = 0, ip = 0,
il = ins.length, scp = {},
op, mdp;
for(; ip < il; ip++) {
op = ins[ip];
if (op == '[') m.push(ip);
if (op == ']') {
scp[ip] = m.pop();
scp[scp[ip]] = ip + 1;
}
}
for(ip = 0, m = []; ip < il;) {
op = ins[ip];
dp += (op == '>' && 1) || (op == '<' && -1) || 0;
mdp = m[dp];
mdp = (op == ',' && inp && inp()) ||
(mdp == 128 && -128) ||
(mdp == -129 && 127) ||
mdp || 0;
mdp += (op == '+' && 1) || (op == '-' && -1) || 0;
ip = (op == '[' && !mdp && scp[ip]) ||
(op == ']' && scp[ip]) ||
(ip + 1);
if (op == '.' && oup) oup(mdp);
m[dp] = mdp;
}
return [m, dp];
}
function fmb(r,f,n){for(var o,p,t=[],u=0,e=0,h=r.length,a={};e<h;e++)'['==(o = r[e])&&t.push(e),']'==o&&(a[e]=t.pop(),a[a[e]]=-~e);for(e=0,t=[];e<h;)p=t[u+=('>'==(o=r[e])?1:'<'==o&&-1)||0],p=','==o&&n&&n()||128==p&&-128||-129==p&&127||p||0,p+=('+'==o?1:'-'==o&&~0)||0,e='['==o&&!p&&a[e]||']'==o&&a[e]||-~e,'.'==o&&f&&f(p),t[u]=p;return[t,u]}
var code = '-[------->+<]>-.-[->+++++<]>++.+++++++..+++.[--->+<]>-----.--[->++++<]>-.--------.+++.------.--------.';
var output = '';
fmb(code, function (v) {
output += String.fromCharCode(v);
});
console.log(output);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment