Earthcomputer

brainfuck.js

Mar 11th, 2019 (edited)
431
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var args = message.getContent().split(" ");
  2. if (args.length == 1) {
  3.     channel.message("$brainfuck <code> [ \"|\" <input> ]");
  4.     return;
  5. }
  6.  
  7. args = args.slice(1).join(" ");
  8. var brainfuck;
  9. var input;
  10. if (args.contains("|")) {
  11.     args = args.split("|");
  12.     brainfuck = args[0];
  13.     input = args.slice(1).join("|").trim().split(" ");
  14. } else {
  15.     brainfuck = args;
  16.     input = "";
  17. }
  18. var ascii = false;
  19. for (var i = 0; i < input.length; i++) {
  20.     if (isNaN(input[i]) || +input[i] % 1 != 0 || +input[i] < 0 || +input[i] >= 256) {
  21.         ascii = true;
  22.         break;
  23.     }
  24. }
  25. if (ascii) {
  26.     input = input.join(" ").split("");
  27.     for (var i = 0; i < input.length; i++) {
  28.         input[i] = input[i].charCodeAt(0) % 256;
  29.     }
  30. } else {
  31.     for (var i = 0; i < input.length; i++) {
  32.         input[i] = +input[i];
  33.     }
  34. }
  35.  
  36. var pc = 0;
  37. var ptr = 0;
  38. var inputIndex = 0;
  39. var mem = []
  40. var stack = [];
  41. var output = [];
  42. var zeroIdx = 0;
  43.  
  44. function adjustIndex(idx) {
  45.     if (idx < 0) {
  46.         mem.unshift(0);
  47.         idx++;
  48.         zeroIdx--;
  49.     } else while (idx >= mem.length) {
  50.         mem.push(0);
  51.     }
  52.     return idx;
  53. }
  54.  
  55. programLoop:
  56. while (pc != brainfuck.length) {
  57.     var ch = brainfuck[pc];
  58.     switch (ch) {
  59.         case ">":
  60.             ptr++;
  61.             break;
  62.         case "<":
  63.             ptr--;
  64.             break;
  65.         case "+":
  66.             ptr = adjustIndex(ptr);
  67.             mem[ptr] = mem[ptr] == 255 ? 0 : mem[ptr] + 1;
  68.             break;
  69.         case "-":
  70.             ptr = adjustIndex(ptr);
  71.             mem[ptr] = mem[ptr] == 0 ? 255 : mem[ptr] - 1;
  72.             break;
  73.         case ".":
  74.             ptr = adjustIndex(ptr);
  75.             output.push(mem[ptr]);
  76.             break;
  77.         case ",":
  78.             var val;
  79.             if (inputIndex >= input.length) {
  80.                 val = 0;
  81.             } else {
  82.                 val = input[inputIndex];
  83.                 inputIndex++;
  84.             }
  85.             ptr = adjustIndex(ptr);
  86.             mem[ptr] = val;
  87.             break;
  88.         case "[":
  89.             ptr = adjustIndex(ptr);
  90.             if (mem[ptr] != 0) {
  91.                 stack.push(pc);
  92.             } else {
  93.                 var bracketCount = 1;
  94.                 while (bracketCount > 0) {
  95.                     pc++;
  96.                     if (pc == brainfuck.length) {
  97.                         channel.message("Unbalanced [] square brackets");
  98.                         stack = [];
  99.                         break programLoop;
  100.                     }
  101.                     if (brainfuck[pc] == "[")
  102.                         bracketCount++;
  103.                     else if (brainfuck[pc] == "]")
  104.                         bracketCount--;
  105.                 }
  106.             }
  107.             break;
  108.         case "]":
  109.             if (stack.length == 0) {
  110.                 channel.message("Unbalanced [] square brackets");
  111.                 break programLoop;
  112.             }
  113.             pc = stack.pop() - 1;
  114.             break;
  115.         case "?":
  116.             var indices = "";
  117.             var values = "";
  118.             for (var i = 0; i < mem.length; i++) {
  119.                 var ind = "" + (i + zeroIdx);
  120.                 var val = "" + mem[i];
  121.                 while (ind.length < val.length)
  122.                     ind = " " + ind;
  123.                 while (val.length < ind.length)
  124.                     val = " " + val;
  125.                 if (indices.length != 0)
  126.                     indices += " ";
  127.                 indices += ind;
  128.                 if (values.length != 0)
  129.                     values += " ";
  130.                 values += val;
  131.             }
  132.             channel.message("```\nIndices: " + indices + "\nValues:  " + values + "\n```");
  133.             break;
  134.     }
  135.     pc++;
  136. }
  137.  
  138. if (stack.length != 0)
  139.     channel.message("Unbalanced [] square brackets");
  140.  
  141. if (output.length == 0) {
  142.     channel.message("Program terminated with no output");
  143. } else {
  144.     channel.message(output.join(", "));
  145.     for (var i = 0; i < output.length; i++)
  146.         output[i] = output[i] <= 32 ? " " : String.fromCharCode(output[i]);
  147.     channel.message(output.join(""));
  148. }
Add Comment
Please, Sign In to add comment