Created
January 3, 2018 03:30
-
-
Save devNoiseConsulting/400e986dc8e1e02e50c2a1745458e00c to your computer and use it in GitHub Desktop.
Coprocessor Conflagration - Advent of Code - 20171223
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| let coprocessorConflagration = function(instructions, regA = 0) { | |
| let offset = 'a'.charCodeAt(); | |
| let registers = new Array(10).fill(0); | |
| registers[0] = regA; | |
| let multiplied = 0; | |
| let index = 0; | |
| let executeInstruction = function(instruction) { | |
| let [operation, a, b] = instruction.split(' '); | |
| let aIndex = a.charCodeAt() - offset; | |
| a = parseInt(a); | |
| if (Number.isNaN(a)) { | |
| a = registers[aIndex]; | |
| } | |
| if (b) { | |
| let bIndex = b.charCodeAt() - offset; | |
| b = parseInt(b); | |
| if (Number.isNaN(b)) { | |
| b = registers[bIndex]; | |
| } | |
| } | |
| //console.log(registers[aIndex], a, b); | |
| switch (operation) { | |
| case 'set': | |
| registers[aIndex] = b; | |
| break; | |
| case 'sub': | |
| registers[aIndex] = a - b; | |
| break; | |
| case 'mul': | |
| registers[aIndex] = a * b; | |
| multiplied++; | |
| break; | |
| case 'jnz': | |
| if (a !== 0) { | |
| index += b - 1; | |
| } | |
| break; | |
| } | |
| index++; | |
| //console.log(registers[aIndex]); | |
| }; | |
| while (index < instructions.length) { | |
| //console.log(index, instructions[index]); | |
| executeInstruction(instructions[index]); | |
| } | |
| console.log(registers); | |
| return multiplied; | |
| }; | |
| let coprocessorConflagration_2 = function(instructions, regA = 0) { | |
| let offset = 'a'.charCodeAt(); | |
| let registers = new Array(8).fill(0); | |
| registers[0] = regA; | |
| let multiplied = 0; | |
| // 0 1 2 3 4 5 6 7 | |
| // a b c d e f g h | |
| registers[1] = 84; // set b 84 | |
| registers[2] = registers[1]; // set c b | |
| // jnz a 2 | |
| // jnz 1 5 | |
| if (registers[0] !== 0) { | |
| registers[1] *= 100; // mul b 100 | |
| multiplied++; | |
| registers[1] += 10000; // sub b -100000 | |
| registers[2] = registers[1]; // set c b | |
| registers[2] += 17000; // sub c -17000 | |
| } | |
| // Start Loop 3 | |
| do { | |
| registers[5] = 1; // set f 1 | |
| // Start of Loop 2 | |
| for (registers[3] = 2; registers[3] * registers[3] < registers[1]; registers[3]++) { | |
| // Start of Loop 1 | |
| for (registers[4] = 2; registers[4] * registers[4] < registers[1]; registers[4]++) { | |
| registers[6] = registers[3] * registers[4] - registers[1]; | |
| if (registers[6] == 0) { | |
| registers[5] = 0; | |
| break; | |
| } | |
| } | |
| } | |
| // End Loop 2 | |
| // jnz g -13 | |
| // jnz f 2 | |
| if (registers[6] !== 0) { | |
| registers[7]++; // sub h -1 | |
| } | |
| registers[3] += 1; | |
| registers[6] = registers[1]; // set g b | |
| registers[6] -= registers[2]; // sub g c | |
| registers[2] += 17; // sub b -17 | |
| } while (registers[6] !== 0); | |
| // End Loop 3 | |
| // jnz 1 -23 | |
| return multiplied; | |
| }; | |
| let coprocessorConflagration_3 = function(instructions, regA = 0) { | |
| let mulCount = 0; | |
| let registers = new Array(8).fill(0); | |
| registers[0] = regA; | |
| registers[1] = 84; | |
| registers[2] = registers[1]; | |
| if (registers[0] != 0) { | |
| registers[1] *= 100; | |
| mulCount++; //5 | |
| registers[1] += 100000; //6 | |
| registers[2] = registers[1]; //7 | |
| registers[2] += 17000; //8 | |
| } | |
| do { | |
| registers[5] = 1; //9 | |
| registers[3] = 2; //10 | |
| do { | |
| registers[4] = 2; //11 | |
| do { | |
| registers[6] = registers[3]; //12 | |
| registers[6] *= registers[4]; | |
| mulCount++; //13 | |
| registers[6] -= registers[1]; //14 | |
| if (registers[6] == 0) { | |
| registers[5] = 0; //16 | |
| } | |
| registers[4] += 1; //17 | |
| registers[6] = registers[4]; //18 | |
| registers[6] -= registers[1]; //19 | |
| } while (registers[6] != 0); | |
| registers[3] += 1; //21 | |
| registers[6] = registers[3]; //22 | |
| registers[6] -= registers[1]; //23 | |
| } while (registers[6] != 0); | |
| if (registers[5] == 0) { | |
| registers[7] += 1; //26 | |
| } | |
| registers[6] = registers[1]; //27 | |
| registers[6] -= registers[2]; //28 | |
| registers[1] += 17; //31 | |
| } while (registers[6] != 0); | |
| return registers; | |
| }; | |
| let coprocessorConflagration_4 = function(instructions, regA = 0) { | |
| let mulCount = 0; | |
| let registers = new Array(8).fill(0); | |
| registers[0] = regA; | |
| registers[1] = 84; | |
| registers[2] = registers[1]; | |
| if (registers[0] != 0) { | |
| registers[1] *= 100; | |
| mulCount++; //5 | |
| registers[1] += 100000; //6 | |
| registers[2] = registers[1]; //7 | |
| registers[2] += 17000; //8 | |
| } | |
| do { | |
| registers[5] = 1; //9 | |
| registers[3] = 2; //10 | |
| do { | |
| registers[4] = 2; //11 | |
| do { | |
| registers[6] = registers[3]; //12 | |
| registers[6] *= registers[4]; | |
| mulCount++; //13 | |
| registers[6] -= registers[1]; //14 | |
| if (registers[6] == 0) { | |
| registers[5] = 0; //16 | |
| } | |
| registers[4] += 1; //17 | |
| registers[6] = registers[4]; //18 | |
| registers[6] -= registers[1]; //19 | |
| } while (registers[6] != 0); | |
| registers[3] += 1; //21 | |
| registers[6] = registers[3]; //22 | |
| registers[6] -= registers[1]; //23 | |
| } while (registers[6] != 0); | |
| if (registers[5] == 0) { | |
| registers[7] += 1; //26 | |
| } | |
| registers[6] = registers[1]; //27 | |
| registers[6] -= registers[2]; //28 | |
| registers[1] += 17; //31 | |
| } while (registers[6] != 0); | |
| return registers; | |
| }; | |
| //903 | |
| function solve2(n) { | |
| let r = { | |
| b: 84, | |
| c: 84, | |
| d: 0, | |
| f: 0, | |
| g: 0, | |
| h: 0 | |
| }; | |
| r['b'] *= 100; | |
| r['b'] += 100000; | |
| r['c'] = r['b']; | |
| r['c'] += 17000; | |
| do { | |
| r['f'] = 1; | |
| r['d'] = 2; | |
| for (let d = r['d']; d * d < r['b']; d++) { | |
| if (r['b'] % d === 0) { | |
| r['f'] = 0; | |
| break; | |
| } | |
| } | |
| if (r['f'] === 0) r['h']++; | |
| r['g'] = r['b'] - r['c']; | |
| r['b'] += 17; | |
| } while (r['g'] !== 0); | |
| return r['h']; | |
| } | |
| let test_1 = `set b 84 | |
| set c b | |
| jnz a 2 | |
| jnz 1 5 | |
| mul b 100 | |
| sub b -100000 | |
| set c b | |
| sub c -17000 | |
| set f 1 | |
| set d 2 | |
| set e 2 | |
| set g d | |
| mul g e | |
| sub g b | |
| jnz g 2 | |
| set f 0 | |
| sub e -1 | |
| set g e | |
| sub g b | |
| jnz g -8 | |
| sub d -1 | |
| set g d | |
| sub g b | |
| jnz g -13 | |
| jnz f 2 | |
| sub h -1 | |
| set g b | |
| sub g c | |
| jnz g 2 | |
| jnz 1 3 | |
| sub b -17 | |
| jnz 1 -23`.split('\n'); | |
| let test_2 = ``.split('\n'); | |
| /* | |
| test = `set a 1 | |
| add a 2 | |
| mul a a | |
| mod a 5 | |
| snd a | |
| set a 0 | |
| rcv a | |
| jgz a -1 | |
| set a 1 | |
| jgz a -2`.split('\n'); | |
| */ | |
| let test = test_1; | |
| let result; | |
| result = coprocessorConflagration(test, 0); | |
| console.log(result); | |
| result = coprocessorConflagration_2(test, 1); | |
| console.log(result); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment