Guest User

Untitled

a guest
Dec 5th, 2019
398
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class IntCode {
  2.     constructor() {
  3.         this.program = [99];
  4.         this.input = [];
  5.         this.outputBuffer = [];
  6.         this.pointer = 0;
  7.     }
  8.  
  9.     run (program, input) {
  10.         this.program = program;
  11.         this.input = input;
  12.         while(this.pointer >= 0 && this.pointer < this.program.length) {
  13.             this.tick();
  14.         }
  15.         console.log("Output: " + this.outputBuffer);
  16.     }
  17.  
  18.     tick() {
  19.         let operation = this.parseCommand();
  20.         this.pointer = this.ops[operation.o](this.program, this.pointer, operation.m);
  21.     }
  22.  
  23.     parseCommand() {
  24.         let command = "" + this.program[this.pointer++];
  25.         let operation = command.slice(-2);
  26.         let modes = command.slice(0, command.length-2).split("").reverse();
  27.         while(modes.length < 3) modes.push("0");
  28.         modes = modes.map(m => parseInt(m, 10))
  29.         operation = parseInt(operation, 10);
  30.         return {o: operation, m: modes};
  31.     }
  32.  
  33.     getMem(index, mode = 0) {
  34.         return (mode ? this.program[index] : this.program[this.program[index]]);
  35.     }
  36.  
  37.     setMem(index, value) {
  38.         this.program[this.program[index]] = value;
  39.     }
  40.  
  41.     getInput() {
  42.         this.inputPointer = this.inputPointer || 0;
  43.         if(this.inputPointer >= this.input.length) throw "Attempting to access empty input";
  44.         return this.input[this.inputPointer];
  45.     }
  46.  
  47.     output(value) {
  48.         this.outputBuffer.push(value);
  49.     }
  50.  
  51.     get ops () {
  52.         return {
  53.             1: (p, i, m) => { // ADD
  54.                 let mp = 0;
  55.                 let r = this.getMem(i++, m[mp++]) + this.getMem(i++, m[mp++]);
  56.                 this.setMem(i++, r);
  57.                 return i;
  58.             },
  59.             2: (p, i, m) => { // MUL
  60.                 let mp = 0;
  61.                 let r = this.getMem(i++, m[mp++]) * this.getMem(i++, m[mp++]);
  62.                 this.setMem(i++, r);
  63.                 return i;
  64.             },
  65.             3: (p, i, m) => { // INPUT
  66.                 this.setMem(i++, this.getInput());
  67.                 return i;
  68.             },
  69.             4: (p, i, m) => { // OUTPUT
  70.                 this.output(this.getMem(i++, m[0]));
  71.                 return i;
  72.             },
  73.             5: (p, i, m) => { // JUMP IF TRUE
  74.                 let mp = 0;
  75.                 if(this.getMem(i++, m[mp++])) i = this.getMem(i++, m[mp++]);
  76.                 else ++i;
  77.                 return i;
  78.             },
  79.             6: (p, i, m) => { // JUMP IF FALSE
  80.                 let mp = 0;
  81.                 if(!this.getMem(i++, m[mp++])) i = this.getMem(i++, m[mp++]);
  82.                 else ++i;
  83.                 return i;
  84.             },
  85.             7: (p, i, m) => { // LESS THAN
  86.                 let mp = 0;
  87.                 let r = (this.getMem(i++, m[mp++]) < this.getMem(i++, m[mp++]) ? 1 : 0)
  88.                 this.setMem(i++, r);
  89.                 return i;
  90.             },
  91.             8: (p, i, m) => { // EQUALS
  92.                 let mp = 0;
  93.                 let r = (this.getMem(i++, m[mp++]) == this.getMem(i++, m[mp++]) ? 1 : 0)
  94.                 this.setMem(i++, r);
  95.                 return i;
  96.             },
  97.             99: (p, i, m) => { // END
  98.                 return -1;
  99.             }
  100.         }
  101.     }
  102. }
  103.  
  104. let TEST = [3,225,1,225,6,6,1100,1,238,225,104,0,1002,114,46,224,1001,224,-736,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,1,166,195,224,1001,224,-137,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1001,169,83,224,1001,224,-90,224,4,224,102,8,223,223,1001,224,2,224,1,224,223,223,101,44,117,224,101,-131,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1101,80,17,225,1101,56,51,225,1101,78,89,225,1102,48,16,225,1101,87,78,225,1102,34,33,224,101,-1122,224,224,4,224,1002,223,8,223,101,7,224,224,1,223,224,223,1101,66,53,224,101,-119,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,1102,51,49,225,1101,7,15,225,2,110,106,224,1001,224,-4539,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,88,78,225,102,78,101,224,101,-6240,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,226,677,224,102,2,223,223,1006,224,329,101,1,223,223,1108,226,677,224,1002,223,2,223,1005,224,344,101,1,223,223,8,226,677,224,102,2,223,223,1006,224,359,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,374,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,389,1001,223,1,223,1108,677,226,224,1002,223,2,223,1006,224,404,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,419,1001,223,1,223,1107,677,226,224,1002,223,2,223,1006,224,434,101,1,223,223,108,677,677,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,464,1001,223,1,223,108,226,226,224,1002,223,2,223,1006,224,479,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,108,677,226,224,102,2,223,223,1005,224,509,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,524,101,1,223,223,7,226,677,224,1002,223,2,223,1006,224,539,101,1,223,223,7,677,226,224,102,2,223,223,1006,224,554,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,569,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,584,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,599,1001,223,1,223,1008,677,226,224,1002,223,2,223,1005,224,614,1001,223,1,223,8,677,677,224,1002,223,2,223,1006,224,629,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,659,101,1,223,223,107,226,226,224,1002,223,2,223,1006,224,674,1001,223,1,223,4,223,99,226];
  105. let computer = new IntCode();
  106. computer.run(TEST, [5])
Advertisement
Add Comment
Please, Sign In to add comment