commit 86c5dfa4409581e348bb8027037abdd7ccba9435
parent 71d2698f9ff0d33b8a65d46825e2e12ad01802e7
Author: finwo <finwo@pm.me>
Date: Wed, 24 Dec 2025 15:19:02 +0100
Completed 2025/02
Diffstat:
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`);