index.js (1492B)
1 #!/usr/bin/env node 2 3 const fs = require('node:fs'); 4 5 // Parse input into something digestable 6 const input = fs 7 .readFileSync('input', 'utf-8') 8 .split('\r\n').join('\n') 9 .split('\r').join('\n') 10 .split('\n') 11 .filter(e => e) 12 .map(line => { 13 const parts = line.split(': '); 14 const outputs = parts.pop().split(' '); 15 return { 16 key: parts.shift(), 17 outputs, 18 } 19 }); 20 21 22 function finder(map, known) { 23 const queue = [...map]; 24 let idle = 0; 25 outer: while(queue.length) { 26 if (idle > (queue.length*2)) break; 27 const entry = queue.shift(); 28 if (entry.key in known) continue; 29 for(const output of entry.outputs) { 30 if (!(output in known)) { 31 queue.push(entry); 32 idle++; 33 continue outer; 34 } 35 } 36 idle = 0; 37 known[entry.key] = entry.outputs.reduce((r,key)=>r+known[key],0); 38 } 39 return known; 40 } 41 42 const part1_map = finder(input, { out: 1 }); 43 const part1 = part1_map.you; 44 process.stdout.write(`------[ Part 1: ${part1} ]------\n`); 45 46 // const part2_dac_fft = finder(input, { fft: 1, out: 0 }); 47 48 const part2_svr_fft = finder(input, { fft: 1, out: 0 }); 49 const part2_fft_dac = finder(input, { dac: 1, out: 0 }); 50 const part2_dac_out = finder(input, { out: 1 }); 51 52 // console.log({ 53 // svr_fft: part2_svr_fft.svr, 54 // fft_dac: part2_fft_dac.fft, 55 // dac_out: part2_dac_out.dac, 56 // }); 57 58 const part2 = part2_svr_fft.svr * part2_fft_dac.fft * part2_dac_out.dac; 59 process.stdout.write(`------[ Part 2: ${part2} ]------\n`);