const fs = require('fs'); const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); const lines = input.split("\n"); let registerA = BigInt(parseInt(lines[0].split(' ')[2])); let registerB = BigInt(parseInt(lines[1].split(' ')[2])); let registerC = BigInt(parseInt(lines[2].split(' ')[2])); let output: Array = []; let instructionsStr = lines[4].split(' ')[1]; const instructions = instructionsStr.split(',').map((i: string) => parseInt(i)); let pointer = 0; function combo(op: bigint): bigint { if (op <= 3n) { return op; } if (op === 4n) { return registerA; } if (op === 5n) { return registerB; } if (op === 6n) { return registerC; } return op; } function call(ins: number, op: number) { let bop = BigInt(op); if (ins === 0) { bop = combo(bop); registerA = registerA >> bop; return; } if (ins === 1) { registerB ^= bop; return; } if (ins === 2) { bop = combo(bop); registerB = bop & 7n; return; } if (ins === 4) { registerB ^= registerC; return; } if (ins === 5) { bop = combo(bop); output.push(''+(bop & 7n)); return; } if (ins === 6) { bop = combo(bop); registerB = registerA >> bop; return; } if (ins === 7) { bop = combo(bop); registerC = registerA >> bop; return; } } function printPC() { console.log(` A: ${registerA} B: ${registerB} C: ${registerC} ins: ${typeof instructions[pointer] !== 'undefined' ? instructions[pointer] : 'NA'} op: ${typeof instructions[pointer+1] !== 'undefined' ? instructions[pointer+1] : 'NA'} combo: ${typeof instructions[pointer+1] !== 'undefined' ? combo(instructions[pointer+1]) : 'NA'} Output: ${output} `); } function run() { while (pointer < instructions.length) { const ins = instructions[pointer]; const op = instructions[pointer + 1]; if (ins === 3) { pointer = registerA === 0n ? pointer + 2 : op; } else { call(ins, op); pointer += 2; } } } run(); console.log(output.join(','));