Skip to content

Instantly share code, notes, and snippets.

@towc
Created December 21, 2018 17:52
Show Gist options
  • Save towc/6b642721584b460a204a4302be6ccebc to your computer and use it in GitHub Desktop.
Save towc/6b642721584b460a204a4302be6ccebc to your computer and use it in GitHub Desktop.
const c1 = 15466939;
const c2 = 65899;
//const s = 5285447;15615244;
const nums = [];
const dupes = [];
let [r1, r2, r3, r4, r5] = [0, 0, 0, 0, 0];
let hits = 0;
L6: while(true) {
r4 = 65536 | r5;
r5 = c1;
L8: while(true) {
r3 = r4 & 0xff;
r5 = (r5 + r3) & 0xffffff;
r5 = (r5 * c2) & 0xffffff;
if (256 > r4) {
// custom
++hits;
if (nums.includes(r5)) {
} else {
nums.push(r5);
// for part 2, look at the last output of this
console.log(hits, r5);
}
if (hits > 100000) {
break L6;
} else {
continue L6;
}
// !custom
} else {
r3 = 0;
while((r3 + 1) * 256 <= r4) {
++r3;
}
r4 = r3;
continue L8;
}
}
}
console.log([r1, r2, r3, r4, r5]);
// C ← op(A, B)
let beforeIp;
let ip = 0;
let ipReg;
const regs = [0, 0, 0, 0, 0, 0];
const instructions = {
setIp: (value, regs) => { beforeIp = regs[value]; ipReg = value; regs[value] = ip; },
seti: ([a,b,c], r) => r[c] = a,
setr: ([a,b,c], r) => r[c] = r[a],
addi: ([a,b,c], r) => r[c] = r[a] + b,
addr: ([a,b,c], r) => r[c] = r[a] + r[b],
muli: ([a,b,c], r) => r[c] = r[a] * b,
mulr: ([a,b,c], r) => r[c] = r[a] * r[b],
bani: ([a,b,c], r) => r[c] = r[a] & b,
banr: ([a,b,c], r) => r[c] = r[a] & r[b],
bori: ([a,b,c], r) => r[c] = r[a] | b,
borr: ([a,b,c], r) => r[c] = r[a] | r[b],
gtir: ([a,b,c], r) => r[c] = Number(a > r[b]),
gtri: ([a,b,c], r) => r[c] = Number(r[a] > b),
gtrr: ([a,b,c], r) => r[c] = Number(r[a] > r[b]),
eqir: ([a,b,c], r) => r[c] = Number(a === r[b]),
eqri: ([a,b,c], r) => r[c] = Number(r[a] === b),
eqrr: ([a,b,c], r) => r[c] = Number(r[a] === r[b]),
}
const program = require('fs').readFileSync('aoc-input-21', 'utf-8').trim()
.split('\n')
.map(line => {
if (line.startsWith('#ip')) {
return {
action: instructions.setIp,
value: Number(line.split(' ')[1]),
line,
}
} else {
const [inst, ...args] = line.split(' ');
return {
action: instructions[inst],
value: args.map(Number),
line,
};
}
});
//apparently this instruction is not part of the program
const ipSetter = program.shift();
ipSetter.action(ipSetter.value, regs);
program.forEach((line, i) => {
console.log(i.toString().padStart(2, '0'), line.line);
})
const initReg = 0;
regs[0] = initReg;
let gen = 0;
while(ip >= 0 && ip < program.length) {
++gen;
const instr = program[ip];
const pip = ip;
instr.action(instr.value, regs);
if (ip === 28) {
console.log(regs[5]);
break;
}
if (ipReg) {
++regs[ipReg];
ip = regs[ipReg];
} else {
++ip;
}
}
#ip 2
seti 123 0 5
bani 5 456 5
eqri 5 72 5
addr 5 2 2
seti 0 0 2
seti 0 4 5
bori 5 65536 4
seti 15466939 9 5
bani 4 255 3
addr 5 3 5
bani 5 16777215 5
muli 5 65899 5
bani 5 16777215 5
gtir 256 4 3
addr 3 2 2
addi 2 1 2
seti 27 8 2
seti 0 7 3
addi 3 1 1
muli 1 256 1
gtrr 1 4 1
addr 1 2 2
addi 2 1 2
seti 25 2 2
addi 3 1 3
seti 17 7 2
setr 3 7 4
seti 7 3 2
eqrr 5 0 3
addr 3 2 2
seti 5 9 2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment