advent-of-code

Entries to advent of code, multiple years
git clone git://git.finwo.net/misc/advent-of-code
Log | Files | Refs

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`);