Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // C ← op(A, B)
- let beforeIp;
- let ip = 0;
- let ipReg;
- const regs = [1, 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-19', '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);
- // 10551343
- // part 2 doesn't really complete, but observation shows what formula to use to compute the result
- // for part 1, uncomment next line
- //regs[0] = 0;
- let gen = 0;
- while(ip >= 0 && ip < program.length) {
- ++gen;
- const instr = program[ip];
- instr.action(instr.value, regs);
- if (ipReg) {
- ++regs[ipReg];
- ip = regs[ipReg];
- } else {
- ++ip;
- }
- }
- console.log(gen, regs);
Add Comment
Please, Sign In to add comment