Skip to content

Instantly share code, notes, and snippets.

@devNoiseConsulting
Created January 3, 2018 03:30
Show Gist options
  • Select an option

  • Save devNoiseConsulting/400e986dc8e1e02e50c2a1745458e00c to your computer and use it in GitHub Desktop.

Select an option

Save devNoiseConsulting/400e986dc8e1e02e50c2a1745458e00c to your computer and use it in GitHub Desktop.
Coprocessor Conflagration - Advent of Code - 20171223
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