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 = []; 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));