Created
June 7, 2015 04:24
-
-
Save nathggns/7ccf21d90f4e7c1af7db to your computer and use it in GitHub Desktop.
brainfuck in typescript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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