Files
AoC/2024/24/index.ts
2024-12-24 10:13:53 +00:00

55 lines
1.3 KiB
TypeScript

const fs = require('fs');
const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
const [initStr, gatesStr] = input.split("\n\n");
const valMap: { [key: string]: number }= {};
const gateMap: { [key: string]: [string, string, string] } = {};
const outputWires: Array<string> = [];
initStr.split("\n").forEach((s: string) => {
const [wire, val] = s.split(': ');
valMap[wire] = parseInt(val, 2);
});
gatesStr.split("\n").forEach((s: string) => {
const [inp, out] = s.split(' -> ');
const [val1, op, val2] = inp.split(' ');
gateMap[out] = [val1, op, val2];
if (out.startsWith('z')) {
outputWires.push(out);
}
});
function getWireVal(wire: string): number {
if (Object.hasOwn(valMap, wire)) {
return valMap[wire];
}
const val = getVal(...gateMap[wire])
valMap[wire] = val;
return val;
}
function getVal(wire1: string, op: string, wire2: string): number {
const val1 = getWireVal(wire1);
const val2 = getWireVal(wire2);
return {
AND: () => val1 & val2,
OR: () => val1 | val2,
XOR: () => val1 ^ val2,
}[op]!();
}
outputWires.sort().reverse();
let outputStr = '';
outputWires.forEach((wire) => {
outputStr += getWireVal(wire);
});
console.log(outputStr, parseInt(outputStr, 2));