Brainfuck isolated testing environment:




Brainfuck source code in cross-browser JavaScript object literal:


3.88 KBstatic@nightlydev:/javascript/BF.js
  1. var BF = {
  2.  
  3.   encode:function(s,n){ return this._produce(s,n); },
  4.  
  5.   decode:function(s,u){ return this._execute(s,u); },
  6.  
  7.   _execute: function(src, usr) {
  8.     var interpret = function(bf) {
  9.       if (typeof bf.out == 'undefined') bf.out = new String();
  10.       do {
  11.         switch(bf.src[bf.pos.src]) {
  12.           case '+':
  13.             bf.mem[bf.pos.mem]++;
  14.             break;
  15.           case '-':
  16.             bf.mem[bf.pos.mem]--;
  17.             break;
  18.           case '>':
  19.             bf.pos.mem++;
  20.             if (typeof bf.mem[bf.pos.mem] == 'undefined')
  21.               bf.mem[bf.pos.mem] = 0;
  22.             break;
  23.           case '<':
  24.             bf.pos.mem--;
  25.             break;
  26.           case '.':
  27.             bf.out += String.fromCharCode(bf.mem[bf.pos.mem]);
  28.             break;
  29.           case ',':
  30.             bf.mem[bf.pos.mem] = (bf.pos.usr==bf.usr.length)
  31.               ? 0 : bf.usr.charCodeAt(bf.pos.usr++);
  32.             break;
  33.           case '[':
  34.             if (bf.mem[bf.pos.mem] == 0) {
  35.               var end = 1;
  36.               while(end && bf.pos.src++ < bf.src.length)
  37.                 if (bf.src[bf.pos.src] == '[') end++;
  38.                 else if (bf.src[bf.pos.src] == ']') end--;
  39.             } else {
  40.               var pos = bf.pos.src++;
  41.               if ((bf=interpret(bf)).yes) bf.pos.src = --pos;
  42.             }
  43.             break;
  44.           case ']':
  45.             bf.yes = (bf.mem[bf.pos.mem] != 0);
  46.             return bf;
  47.         }
  48.       } while (++bf.pos.src < bf.src.length);
  49.       return bf.out;
  50.     };
  51.     return ( (typeof src != 'string')
  52.       || (typeof usr != 'string' && typeof usr != 'undefined')
  53.     ) ? new String() : interpret({
  54.       src: src,
  55.       usr: usr || new String(),
  56.       mem: [new Number()],
  57.       pos: {
  58.         src: new Number(),
  59.         usr: new Number(),
  60.         mem: new Number()
  61.       }
  62.     });
  63.   },
  64.  
  65.   _produce:function(str, numStacks) {
  66.     if (numStacks<=0 || typeof numStacks == 'undefined')
  67.       return this._produceShortest(str);
  68.     var writeStacks = function(stack,amount) {
  69.       var repeat = function(c,loops) {
  70.         var newStr = new String();
  71.         for (var i=0; i<loops; i++) newStr += c;
  72.         return newStr;
  73.       };
  74.       var s = repeat("+",amount) + "[";
  75.       for (var i=1; i<stack; i++)
  76.         s += ">" + repeat("+",i+1);
  77.       s += repeat("<",stack-1) + "-]";
  78.       s += repeat("+",amount);
  79.       return s;
  80.     };
  81.     var getRange = function(amount,inc,dec) {
  82.       var s = new String();
  83.       if (amount>0)
  84.         for (var i=0; i<amount; i++) s += inc;
  85.       else
  86.         for (var i=0; i<-amount; i++) s += dec;
  87.       return s;
  88.     };
  89.     var stacks = new Array(numStacks);
  90.     var diff = Math.floor(127/numStacks);
  91.     for (var i=0; i<numStacks; i++) stacks[i] = (i + 1) * diff;
  92.     var src = writeStacks(numStacks,diff);
  93.     var i = new Number();
  94.     var curStack = new Number();
  95.     var newStack = new Number();
  96.     while (i < str.length) {
  97.       var c = str.charCodeAt(i);
  98.       var minStack = 0;
  99.       for (var j=1; j<stacks.length; j++)
  100.         if (Math.abs(c-stacks[j]) < Math.abs(c-stacks[minStack]))
  101.           minStack = j;
  102.       if (Math.abs(c-stacks[minStack]) > Math.abs(c-stacks[curStack]))
  103.         newStack = curStack;
  104.       else newStack = minStack;
  105.       src += getRange(newStack-curStack,">","<");
  106.       src += getRange(c-stacks[newStack],"+","-");
  107.       src += ".";
  108.       curStack = newStack;
  109.       stacks[newStack] = c;
  110.       i++;
  111.     }
  112.     return src;
  113.   },
  114.  
  115.   _produceShortest:function(str) {
  116.     var products = new Array(16);
  117.     var shortStack = new Number(1);
  118.     var shortSrc = new String();
  119.     for (var i=1; i<=16; i++) {
  120.       var src = this._produce(str, i);
  121.       products[i-1] = src.length;
  122.       if (products[i-1] < products[shortStack-1]) {
  123.         shortSrc = src;
  124.         shortStack = i;
  125.       }
  126.     }
  127.     return shortSrc;
  128.   }
  129. };

Copyright © 2017  NightlyDev.org (http://nightlydev.org) -
r - ✓ XHTML & CSS - CO2 Neutral -