Skip to content

Instantly share code, notes, and snippets.

@u-mulder
Created April 22, 2018 10:19
Show Gist options
  • Save u-mulder/1e9cf7d77eb62a7d988ace87a714e38c to your computer and use it in GitHub Desktop.
Save u-mulder/1e9cf7d77eb62a7d988ace87a714e38c to your computer and use it in GitHub Desktop.
Brainfuck interpreter for Codewars kata
// Kata url: https://www.codewars.com/kata/my-smallest-code-interpreter-aka-brainf-star-star-k
function brainLuck(code, input) {
let output = '';
let pointer = 0
let input_pointer = 0;
let storage = {};
let t = code.length;
let counter = 0;
let breakFor = false
for (let i = 0; i < t; i++) {
switch(code[i]) {
case '>':
++pointer;
break;
case '<':
if (0 < pointer) {
--pointer;
}
break;
case '+':
if ("undefined" === typeof storage[pointer]) {
storage[pointer] = 0;
}
storage[pointer] = ++storage[pointer] & 255;
break;
case '-':
if ("undefined" === typeof storage[pointer]) {
storage[pointer] = 0;
}
storage[pointer] = --storage[pointer] & 255;
break;
case '.':
output += String.fromCharCode(storage[pointer])
break;
case ',':
if ("undefined" === typeof storage[pointer]) {
storage[pointer] = 0;
}
storage[pointer] = input.codePointAt(input_pointer++);
break;
case '[':
if (!storage[pointer]) {
counter = 1;
i++;
while (counter) {
if ('[' == code[i]) {
++counter;
} else if (']' == code[i]) {
--counter;
}
i++;
if (t <= i) {
breakFor = true;
break;
}
}
if (breakFor) {
breakFor = false;
break;
}
i--;
}
break;
case ']':
if (storage[pointer]) {
counter = 1;
i--;
while (counter) {
if ('[' == code[i]) {
--counter;
} else if (']' == code[i]) {
++counter;
}
i--;
if (i < 0) {
breakFor = true;
break;
}
}
if (breakFor) {
breakFor = false;
break;
}
i++;
}
break;
}
}
return output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment