function getMatchingBra(code) { var stack = []; var bra = []; for(var i = 0; i < code.length; i++) bra.push(-1); for(var i = 0; i < code.length; i++) { if(code[i] === '[') { stack.push(i); } else if(code[i] === ']') { bra[i] = stack.pop(); bra[bra[i]] = i; } } return bra; } function brainFuck(code, input) { var inputPos = 0; var commandPos = 0; var pointerPos = 0; var bytes = [ 0 ]; var output = ""; var matching = getMatchingBra(code); while(commandPos < code.length) { switch(code[commandPos]) { case '>': { pointerPos++; if(undefined === bytes[pointerPos]) { bytes.push(0); } break; } case '<': { pointerPos--; if(0 > pointerPos) { bytes.unshift(0); pointerPos = 0; } break; } case '+': { bytes[pointerPos] = (bytes[pointerPos] + 1) % 256; break; } case '-': { bytes[pointerPos]--; if(bytes[pointerPos] < 0) bytes[pointerPos] = 0; break; } case '.': { output += String.fromCharCode(bytes[pointerPos]); break; } case ',': { var temp = input.charCodeAt(inputPos++); bytes[pointerPos] = temp; break; } case '[': { if(!bytes[pointerPos]) { commandPos = matching[commandPos]; } break; } case ']': { if(bytes[pointerPos]) { commandPos = matching[commandPos]; } break; } } commandPos++; } return output; } var out = brainFuck('+++++++[>+++++[>++>+<<-]>>>+>++>++<<<<<<-]>>+++.[->+<]>.+++.[->+<]>.>[-<->]<---.>>[-<<->>]<<--.'); console.log(out);