advent-of-code

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

commit 86c5dfa4409581e348bb8027037abdd7ccba9435
parent 71d2698f9ff0d33b8a65d46825e2e12ad01802e7
Author: finwo <finwo@pm.me>
Date:   Wed, 24 Dec 2025 15:19:02 +0100

Completed 2025/02

Diffstat:
A2025/02/example.txt | 1+
A2025/02/index.js | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/2025/02/example.txt b/2025/02/example.txt @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 diff --git a/2025/02/index.js b/2025/02/index.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node + +const fs = require('node:fs'); + +const ranges = fs + .readFileSync('input', 'utf-8') + .split('\r\n').join(',') + .split('\r').join(',') + .split('\n').join(',') + .split(',') + .map(str => str.trim()) + .filter(str => str) + +const totalPart1 = []; +const totalPart2 = []; + +// Part 1 solution +for(const range of ranges) { + let [start, end] = range.split('-'); + start = parseInt(start, 10); + end = parseInt(end , 10); + const rangePart1Invalid = []; + for( + let current = start; + current <= end; + current++ + ) { + const stringified = current.toString(10); + const halves = [ + stringified.slice(0, stringified.length / 2), + stringified.slice(stringified.length / 2), + ]; + if (halves[0] === halves[1]) { + rangePart1Invalid.push(current); + } + } + process.stdout.write(`${range} has ${rangePart1Invalid.length} invalid IDs: ${rangePart1Invalid.join(', ')}\n`); + totalPart1.push(...rangePart1Invalid); +} + +const part1 = totalPart1.reduce((r,a) => r+a, 0); +process.stdout.write('\n\n'); + +// Part 2 solution +for(const range of ranges) { + let [start, end] = range.split('-'); + start = parseInt(start, 10); + end = parseInt(end , 10); + const rangePart2Invalid = []; + for( + let current = start; + current <= end; + current++ + ) { + const stringified = current.toString(10); + + for(let sublength = 1 ; sublength <= (stringified.length / 2) ; sublength++) { + + // Not integer-divisible = not composite of substring + if (stringified.length % sublength) continue; + let repetitions = stringified.length / sublength; + + if (stringified.slice(0, sublength).repeat(repetitions) === stringified) { + rangePart2Invalid.push(current); + break; + } + + } + + } + process.stdout.write(`${range} has ${rangePart2Invalid.length} invalid IDs: ${rangePart2Invalid.join(', ')}\n`); + totalPart2.push(...rangePart2Invalid); +} + +const part2 = totalPart2.reduce((r,a) => r+a, 0); +process.stdout.write('\n\n'); + + +process.stdout.write(`------[ Part 1: ${part1} ]------\n`); +process.stdout.write(`------[ Part 2: ${part2} ]------\n\n`);