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 (3176B)


      1 #!/usr/bin/env node
      2 
      3 const fs = require('node:fs');
      4 
      5 const [rawRanges, rawQueries] = fs
      6   .readFileSync('input', 'utf-8')
      7   .split('\r\n').join('\n')
      8   .split('\r').join('\n')
      9   .split('\n\n');
     10 
     11 const ranges = rawRanges
     12   .split('\n')
     13   .filter(line => line)
     14   .map(line => line.split('-').map(n => BigInt(n)))
     15   .map(range => ({ start: range[0], end: range[1] }))
     16 ;
     17 
     18 const queries = rawQueries
     19   .split('\n')
     20   .filter(line => line)
     21   .map(line => BigInt(line))
     22 ;
     23 
     24 const compositeRanges = ranges.map(range => ({...range}));
     25 
     26 for(let i = 0; i < compositeRanges.length; i++) {
     27   const range = compositeRanges[i];
     28 
     29   // Find the first range this low one matches
     30   const foundLow = compositeRanges.find(({start,end}) => {
     31     if (start <= range.start && range.start <= end) return true;
     32     if (start <= range.end   && range.end   <= end) return true;
     33     if (range.start <= start && start <= range.end) return true;
     34     if (range.start <= end   && end   <= range.end) return true;
     35     return false;
     36   });
     37   const foundLowIndex = compositeRanges.indexOf(foundLow);
     38 
     39   // Merge with low range
     40   if (i !== foundLowIndex) {
     41     // process.stdout.write(`Merging ${foundLow.start}-${foundLow.end},${range.start}-${range.end} => `);
     42     range.start = foundLow.start < range.start ? foundLow.start : range.start;
     43     range.end   = foundLow.end   > range.end   ? foundLow.end   : range.end  ;
     44     // process.stdout.write(`${range.start}-${range.end}\n`);
     45     compositeRanges.splice(foundLowIndex, 1);
     46     i = -1;
     47     continue;
     48   }
     49 
     50   // Find the first range this high one matches
     51   const foundHigh = compositeRanges.find(({start,end}) => {
     52     if (start <= range.start && range.start <= end) return true;
     53     if (start <= range.end   && range.end   <= end) return true;
     54     if (range.start <= start && start <= range.end) return true;
     55     if (range.start <= end   && end   <= range.end) return true;
     56     return false;
     57   });
     58   const foundHighIndex = compositeRanges.indexOf(foundHigh);
     59 
     60   // Merge with high range
     61   if (i !== foundHighIndex) {
     62     process.stdout.write(`Merging ${foundHigh.start}-${foundHigh.end},${range.start}-${range.end} => `);
     63     range.start = foundHigh.start < range.start ? foundHigh.start : range.start;
     64     range.end   = foundHigh.end   > range.end   ? foundHigh.end   : range.end  ;
     65     process.stdout.write(`${range.start}-${range.end}\n`);
     66     compositeRanges.splice(foundHighIndex, 1);
     67     i = -1;
     68     continue;
     69   }
     70 }
     71 
     72 const part1 = queries
     73   .filter(ingredientId => compositeRanges.find(({start,end}) => {
     74     if (ingredientId < start) return false;
     75     if (ingredientId > end  ) return false;
     76     return true;
     77   }))
     78   .length;
     79 
     80 const part2 = compositeRanges
     81   // .map(range => `${range.start}-${range.end} => ${range.end - range.start + 1n}`)
     82   .map(range => (range.end - range.start + 1n))
     83   .reduce((r,a) => r+a, 0n)
     84 
     85 console.log(compositeRanges.map(range => `${range.start}-${range.end} => ${range.end - range.start + 1n}`));
     86 console.log(compositeRanges.find(range => range.start > range.end));
     87 
     88 // console.log(part2.join('\n'));
     89 
     90 process.stdout.write(`------[ Part 1: ${part1} ]------\n`);
     91 process.stdout.write(`------[ Part 2: ${part2} ]------\n`);
     92