From 3c3eb2623553c790c4fadfc1296eac1e19abe42d Mon Sep 17 00:00:00 2001 From: Tyler Beckman Date: Tue, 3 Dec 2024 21:42:57 -0700 Subject: [PATCH] Day 5 --- day5/part1.ts | 27 +++++++++++++++++++++++++++ day5/part2.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 day5/part1.ts create mode 100644 day5/part2.ts diff --git a/day5/part1.ts b/day5/part1.ts new file mode 100644 index 0000000..b16e050 --- /dev/null +++ b/day5/part1.ts @@ -0,0 +1,27 @@ +export async function solve() { + const [rules, pages] = await Deno.readTextFile("./input.txt") + .then(i => i + .split("\n\n") + ).then(([rules, pages]) => [ + rules.split("\n").map(e => e.split("|") as [string, string]), + pages.split("\n").map(e => e.split(",")) + ] as const); + + let sum = 0; + + for (const pageGroup of pages) { + let valid = true; + for (let i = 1; i < pageGroup.length; i++) { + const matchingRules = rules.filter(([before, _]) => before == pageGroup[i]).filter( + ([before, _]) => before == pageGroup[i] + ).map(([_, after]) => after); + if (matchingRules.some(after => pageGroup.slice(0, i).includes(after))) { + valid = false; + break + } + } + if (valid) sum += +pageGroup[Math.floor(pageGroup.length / 2)]; + } + + return sum +} diff --git a/day5/part2.ts b/day5/part2.ts new file mode 100644 index 0000000..81e59c3 --- /dev/null +++ b/day5/part2.ts @@ -0,0 +1,46 @@ +function sort(rules: [string, string][], pageGroup: string[]) { + let [valid, error] = validate(rules, pageGroup); + while (!valid) { + const tmp = pageGroup[error![0]]; + pageGroup[error![0]] = pageGroup[error![1]]; + pageGroup[error![1]] = tmp; + + [valid, error] = validate(rules, pageGroup); + } +} + +function validate(rules: [string, string][], pageGroup: string[]): [boolean, null | [number, number]] { + for (let i = 1; i < pageGroup.length; i++) { + const matchingRules = rules.filter(([before, _]) => before == pageGroup[i]).map(([_, after]) => after); + const error = matchingRules.find(after => pageGroup.slice(0, i).includes(after)); + if (error !== undefined) { + return [false, [pageGroup.indexOf(error), i]]; + } + } + + return [true, null] +} + +export async function solve() { + const [rules, pages] = await Deno.readTextFile("./input.txt") + .then(i => i + .split("\n\n") + ).then(([rules, pages]) => [ + rules.split("\n").map(e => e.split("|") as [string, string]), + pages.split("\n").map(e => e.split(",")) + ] as const); + + let sum = 0; + + for (let pageGroup of pages) { + let [valid,error] = validate(rules, pageGroup); + if (valid !== true) { + // console.log(pageGroup, error); + sort(rules, pageGroup); + + sum += +pageGroup[Math.floor(pageGroup.length / 2)]; + }; + } + + return sum +}