home *** CD-ROM | disk | FTP | other *** search
/ Il Mio Computer 2006 May / Mico05CD.bin / Utility / CryptoMX / bf.js < prev    next >
Encoding:
Text File  |  2006-01-05  |  2.8 KB  |  166 lines

  1. BF_ARRAY_LEN = 4000;
  2.  
  3. arr = new Array(BF_ARRAY_LEN);    
  4.  
  5. function push(el, stack)
  6. {
  7.   stack[stack.length] = el;
  8.   return stack;
  9. }
  10.  
  11. function peek(stack)
  12. {
  13.   return stack[stack.length-1];
  14. }
  15.  
  16. function pop(stack)
  17. {
  18.   return stack.slice(0,stack.length-2);
  19. }
  20.  
  21. function evalBF(codestr, outputField)
  22. {
  23.   outputField.value = "";
  24.   for (i=0; i<BF_ARRAY_LEN; i++) arr[i] = 0;
  25.   ptr = 0;
  26.   loopstack = Array();
  27.   i = 0;
  28.  
  29.   while (i < codestr.length)
  30.   {
  31.     switch (codestr.charAt(i))
  32.     {
  33.     case "[":
  34.       if (arr[ptr]!=0) loopstack = push(i,loopstack);
  35.       else i = codestr.indexOf("]",i);
  36.       i++;
  37.       break;
  38.     case "]":
  39.       i = peek(loopstack);
  40.       loopstack = pop(loopstack);
  41.       break;
  42.     case "+":
  43.       arr[ptr]++;
  44.       i++;
  45.       break;
  46.     case "-":
  47.       arr[ptr]--;
  48.       i++;
  49.       break;
  50.     case "<":
  51.       ptr--;
  52.       i++;
  53.       break;
  54.     case ">":
  55.       ptr++;
  56.       i++;
  57.       break;
  58.     case ".":
  59.       outputField.value += String.fromCharCode(arr[ptr]);
  60.       i++;
  61.       break;
  62.     case ",":
  63.       input = prompt("BF program input:","");
  64.       arr[ptr] = input.charCodeAt(0);
  65.       i++;
  66.       break;
  67.     default:
  68.       i++;
  69.       break;
  70.     }
  71.   }
  72. }
  73.  
  74. function strTimes(str,times)
  75. {
  76.   endstr = "";
  77.   for (var i=0; i<times; i++) endstr += str;
  78.   return endstr;
  79. }
  80.  
  81. function printDifference(diff,poschar,negchar)
  82. {
  83.   str = "";
  84.   if (diff>0)
  85.     for (var b=0; b<diff; b++) str += poschar;
  86.   else
  87.     for (var b=0; b<-diff; b++) str += negchar;
  88.   return str;
  89. }
  90.  
  91. function writeBins(numBins,diff)
  92. {
  93.   str = strTimes("+",diff) + "[";
  94.  
  95.   for (var i=1; i<numBins; i++)
  96.   {
  97.     str += ">" + strTimes("+",i+1);
  98.   }
  99.   str += strTimes("<",numBins-1) + "-]";
  100.   str += strTimes("+",diff);
  101.  
  102.   return str;
  103. }
  104.  
  105. function findClosestBin(val,bins,currbin)
  106. {
  107.   var minBin = 0;
  108.   for (var b=1; b<bins.length; b++)
  109.   {
  110.     if (Math.abs(val-bins[b]) < Math.abs(val-bins[minBin])) minBin = b;
  111.   }
  112.   if (Math.abs(val-bins[minBin]) > Math.abs(val-bins[currbin])) return currbin;
  113.   return minBin;
  114. }
  115.  
  116. function text2BF(textstr, numBins)
  117. {
  118.   if (numBins<=0) return "error: too few bins";
  119.   var bins = new Array(numBins);
  120.   var diff = Math.floor(127/numBins);
  121.   for (var i=0; i<numBins; i++) bins[i] = (i + 1) * diff;
  122.   var codestr = writeBins(numBins,diff);
  123.   var i = 0;
  124.   var currbin = 0;
  125.   var newbin = 0;
  126.  
  127.   while (i < textstr.length)
  128.   {
  129.     c = textstr.charCodeAt(i);
  130.     newbin = findClosestBin(c,bins,currbin);
  131.     codestr += printDifference(newbin-currbin,">","<");
  132.     codestr += printDifference(c-bins[newbin],"+","-");
  133.     codestr += ".";
  134.     currbin = newbin;
  135.     bins[newbin] = c;
  136.     i++;
  137.   }
  138.   return codestr;
  139. }
  140.  
  141. function smartText2BF(textstr, binField)
  142. {
  143.    var bestbin = 1;
  144.    var results = new Array(16);
  145.    var beststr = "";
  146.  
  147.    var resultstr = "";
  148.  
  149.    for (var i=1; i<=16; i++)
  150.    {
  151.      var str = text2BF(textstr, i);
  152.      results[i-1] = str.length;
  153.      
  154.      if (results[i-1] < results[bestbin-1])
  155.      {
  156.        beststr = str;
  157.        bestbin = i;
  158.      }
  159.  
  160.      resultstr += i + ": " + results[i-1] + "\n";
  161.    }
  162.  
  163.    binField.value = bestbin;
  164.    return beststr;
  165. }
  166.