import { solvables } from "../main.ts"; import type { Solvable } from "../solvable.ts"; import { readInput } from "../utils.ts"; // check if pattern with given width repeats in input const checkWindow = (width: number, input: number): boolean => { const str = String(input); for (let patternStart = 0; patternStart + 2 * width < str.length; patternStart += width) { const leftPatIdx = [patternStart, patternStart + width] const rightPatIdx = [patternStart + width, patternStart + width + width] const patternRepeated = str.slice(...leftPatIdx) === str.slice(...rightPatIdx); if (patternRepeated) { return true; } } return false } class DayTwo implements Solvable { input = readInput('02') public part1(): DayTwo { const vals: [number, number][] = this.input .split(",") .map(range => range.split("-") .map(Number) as [number, number]); const invalid: number[] = []; for (const [start, end] of vals) { for (let i = start; i <= end; i++) { // if the number is of odd length, it can't have a repeating pattern if (String(i).length % 2 !== 0) { continue; } // check for patterns with increasing width but never exceeding half the length of the number for (let width = 2; width <= String(i).length / 2; width++) { if (checkWindow(width, i)) { invalid.push(i); break; } } } } console.log(invalid.reduce((a, b) => a + b, 0)) return this } public part2(): DayTwo { return this } } solvables.push(new DayTwo())