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


      1 #!/usr/bin/env node
      2 
      3 const fs = require('node:fs');
      4 
      5 const ranges = fs
      6   .readFileSync('input', 'utf-8')
      7   .split('\r\n').join(',')
      8   .split('\r').join(',')
      9   .split('\n').join(',')
     10   .split(',')
     11   .map(str => str.trim())
     12   .filter(str => str)
     13 
     14 const totalPart1 = [];
     15 const totalPart2 = [];
     16 
     17 // Part 1 solution
     18 for(const range of ranges) {
     19   let [start, end] = range.split('-');
     20   start = parseInt(start, 10);
     21   end   = parseInt(end  , 10);
     22   const rangePart1Invalid = [];
     23   for(
     24     let current = start;
     25     current <= end;
     26     current++
     27   ) {
     28     const stringified = current.toString(10);
     29     const halves      = [
     30       stringified.slice(0, stringified.length / 2),
     31       stringified.slice(stringified.length / 2),
     32     ];
     33     if (halves[0] === halves[1]) {
     34       rangePart1Invalid.push(current);
     35     }
     36   }
     37   process.stdout.write(`${range} has ${rangePart1Invalid.length} invalid IDs: ${rangePart1Invalid.join(', ')}\n`);
     38   totalPart1.push(...rangePart1Invalid);
     39 }
     40 
     41 const part1 = totalPart1.reduce((r,a) => r+a, 0);
     42 process.stdout.write('\n\n');
     43 
     44 // Part 2 solution
     45 for(const range of ranges) {
     46   let [start, end] = range.split('-');
     47   start = parseInt(start, 10);
     48   end   = parseInt(end  , 10);
     49   const rangePart2Invalid = [];
     50   for(
     51     let current = start;
     52     current <= end;
     53     current++
     54   ) {
     55     const stringified = current.toString(10);
     56 
     57     for(let sublength = 1 ; sublength <= (stringified.length / 2) ; sublength++) {
     58 
     59       // Not integer-divisible = not composite of substring
     60       if (stringified.length % sublength) continue;
     61       let repetitions = stringified.length / sublength;
     62 
     63       if (stringified.slice(0, sublength).repeat(repetitions) === stringified) {
     64         rangePart2Invalid.push(current);
     65         break;
     66       }
     67 
     68     }
     69 
     70   }
     71   process.stdout.write(`${range} has ${rangePart2Invalid.length} invalid IDs: ${rangePart2Invalid.join(', ')}\n`);
     72   totalPart2.push(...rangePart2Invalid);
     73 }
     74 
     75 const part2 = totalPart2.reduce((r,a) => r+a, 0);
     76 process.stdout.write('\n\n');
     77 
     78 
     79 process.stdout.write(`------[ Part 1: ${part1} ]------\n`);
     80 process.stdout.write(`------[ Part 2: ${part2} ]------\n\n`);