diff --git a/.gitignore b/.gitignore index 85b002b..3ae7acf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store .session +.sessioncookie .tool_versions input \ No newline at end of file diff --git a/load-todays-input.bash b/load-todays-input.bash index 3468018..a47cab1 100644 --- a/load-todays-input.bash +++ b/load-todays-input.bash @@ -1,5 +1,6 @@ day=$(date +%-e) day_zero=$(date +%0e) +year=$(date +%Y) session=$(cat .sessioncookie) mkdir -p input -curl -b "session=${session}" -o "./input/${day_zero}.txt" "https://adventofcode.com/2024/day/${day}/input" \ No newline at end of file +curl -b "session=${session}" -o "./input/${day_zero}.txt" "https://adventofcode.com/${year}/day/${day}/input" \ No newline at end of file diff --git a/main.ts b/main.ts index 523ac96..ccbe83a 100644 --- a/main.ts +++ b/main.ts @@ -13,7 +13,9 @@ const solvables: Solvable[] = []; // only solve the latest day console.log("Solving latest day only:") - const day = solvables.toReversed()[0]; + const day = solvables[0]; + console.log(day) + day.part1() day.part2() })() diff --git a/solutions/02.ts b/solutions/02.ts index e4d8be3..1e712a4 100644 --- a/solutions/02.ts +++ b/solutions/02.ts @@ -3,20 +3,56 @@ import { solvables } from "../main.ts"; import type { Solvable } from "../solvable.ts"; import { readInput } from "../utils.ts"; -class DayOne implements Solvable { - input = readInput('01') - public part1(): DayOne { - const vals: [string, number][] = this.input - .split("\n") - .map(line => [line[0], Number.parseInt(line.slice(1))]); +// 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(): DayOne { + public part2(): DayTwo { return this } } -solvables.push(new DayOne()) \ No newline at end of file +solvables.push(new DayTwo()) \ No newline at end of file