JavaScript DHTML/Security/Brainfuck Converter Interpreter — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 12:59, 26 мая 2010
Brainfuck Converter/Interpreter in JavaScript
<source lang="html4strict">
<html>
<head> <title>Brainfuck Converter/Interpreter</title> <script>
BF_ARRAY_LEN = 4000; arr = new Array(BF_ARRAY_LEN); function push(el, stack) {
stack[stack.length] = el; return stack;
} function peek(stack) {
return stack[stack.length-1];
} function pop(stack) {
return stack.slice(0,stack.length-2);
} function evalBF(codestr, outputField) {
outputField.value = ""; for (i=0; i<BF_ARRAY_LEN; i++) arr[i] = 0; ptr = 0; loopstack = Array(); i = 0; while (i < codestr.length) { switch (codestr.charAt(i)) { case "[": if (arr[ptr]!=0) loopstack = push(i,loopstack); else i = codestr.indexOf("]",i); i++; break; case "]": i = peek(loopstack); loopstack = pop(loopstack); break; case "+": arr[ptr]++; i++; break; case "-": arr[ptr]--; i++; break; case "<": ptr--; i++; break; case ">": ptr++; i++; break; case ".": outputField.value += String.fromCharCode(arr[ptr]); i++; break; case ",": input = prompt("BF program input:",""); arr[ptr] = input.charCodeAt(0); i++; break; default: i++; break; } }
} function strTimes(str,times) {
endstr = ""; for (var i=0; i<times; i++) endstr += str; return endstr;
} function printDifference(diff,poschar,negchar) {
str = ""; if (diff>0) for (var b=0; b<diff; b++) str += poschar; else for (var b=0; b<-diff; b++) str += negchar; return str;
} function writeBins(numBins,diff) {
str = strTimes("+",diff) + "["; for (var i=1; i<numBins; i++) { str += ">" + strTimes("+",i+1); } str += strTimes("<",numBins-1) + "-]"; str += strTimes("+",diff); return str;
} function findClosestBin(val,bins,currbin) {
var minBin = 0; for (var b=1; b<bins.length; b++) { if (Math.abs(val-bins[b]) < Math.abs(val-bins[minBin])) minBin = b; } if (Math.abs(val-bins[minBin]) > Math.abs(val-bins[currbin])) return currbin; return minBin;
} function text2BF(textstr, numBins) {
if (numBins<=0) return "error: too few bins"; var bins = new Array(numBins); var diff = Math.floor(127/numBins); for (var i=0; i<numBins; i++) bins[i] = (i + 1) * diff; var codestr = writeBins(numBins,diff); var i = 0; var currbin = 0; var newbin = 0; while (i < textstr.length) { c = textstr.charCodeAt(i); newbin = findClosestBin(c,bins,currbin); codestr += printDifference(newbin-currbin,">","<"); codestr += printDifference(c-bins[newbin],"+","-"); codestr += "."; currbin = newbin; bins[newbin] = c; i++; } return codestr;
} function smartText2BF(textstr, binField) {
var bestbin = 1; var results = new Array(16); var beststr = ""; var resultstr = ""; for (var i=1; i<=16; i++) { var str = text2BF(textstr, i); results[i-1] = str.length; if (results[i-1] < results[bestbin-1]) { beststr = str; bestbin = i; } resultstr += i + ": " + results[i-1] + "\n"; } binField.value = bestbin; return beststr;
}
</script> </head> <body> <form> Input:
<textarea name="codestr" rows="4" cols="50" wrap="hard"></textarea>
Bins (1-10): <input name="numBins" value="5" size="1" type="text"> <input value="Text2BF" onclick="bfout.value = text2BF(codestr.value, numBins.value)" type="button"> <input value="Smart Text2BF" onclick="bfout.value = smartText2BF(codestr.value, numBins)" type="button"> <input value="Interpret" onclick="evalBF(codestr.value,bfout)" type="button">
Output:
<textarea name="bfout" rows="6" cols="50"></textarea>
</form> </body>
</html>
</source>