From a5c5acbad9a69d76b79854f81d96032d2f4cccad Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 17 Dec 2024 16:52:44 +0000 Subject: [PATCH] Day 17 Part 1 WIP --- 2024/17/index.ts | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 2024/17/index.ts diff --git a/2024/17/index.ts b/2024/17/index.ts new file mode 100644 index 0000000..468c09e --- /dev/null +++ b/2024/17/index.ts @@ -0,0 +1,99 @@ +const fs = require('fs'); + +const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); + +const lines = input.split("\n"); + +let registerA = parseInt(lines[0].split(' ')[2]); +let registerB = parseInt(lines[1].split(' ')[2]); +let registerC = parseInt(lines[2].split(' ')[2]); + +let output: Array = []; + +const instructions = lines[4].split(' ')[1].split(',').map((i: string) => parseInt(i)); + +let pointer = 0; + +function combo(op: number): number { + if (op <= 3) { + return op; + } + if (op === 4) { + return registerA; + } + if (op === 5) { + return registerB; + } + if (op === 6) { + return registerC; + } + return op; +} + +function call(ins: number, op: number) { + if (ins === 0) { + op = combo(op); + registerA = Math.round(registerA / (2 ** op)); + return; + } + if (ins === 1) { + registerB = registerB ^ op; + return; + } + if (ins === 2) { + op = combo(op); + registerB = op % 8; + return; + } + if (ins === 4) { + registerB = registerB ^ registerC; + return; + } + if (ins === 5) { + op = combo(op); + output.push(op % 8); + return; + } + if (ins === 6) { + op = combo(op); + registerB = Math.round(registerA / (2 ** op)); + return; + } + if (ins === 7) { + op = combo(op); + registerC = Math.round(registerA / (2 ** op)); + 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.join(',')} +`); +} + +function run() { + while (pointer < instructions.length) { + printPC(); + const ins = instructions[pointer]; + const op = instructions[pointer + 1]; + + if (ins === 3) { + pointer = registerA === 0 ? pointer + 2 : op; + } else { + call(ins, op); + pointer += 2; + } + } + printPC(); +} + +run();