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