Files
advent-of-code-2022/2023/01/solution.ts
2023-12-07 21:43:37 +01:00

64 lines
1.6 KiB
TypeScript

const sample = await Deno.readTextFile("sample.txt");
const sample2 = await Deno.readTextFile("sample2.txt");
const input = await Deno.readTextFile("input.txt");
const wordsToNumbers: Record<string, number> = {
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
six: 6,
seven: 7,
eight: 8,
nine: 9,
};
const getNumberStringsFromString = (data: string): string[] =>
data.match(/(\d)/g) ?? [];
const getNumberStringsAndNumberWordsFromString = (data: string): string[] =>
Array.from(
data.matchAll(
new RegExp(`(?=(\\d|${Object.keys(wordsToNumbers).join("|")}))`, "gi"),
),
(x) => x[1],
);
const replaceWordNumbersToNumbers = (data: string): string =>
data.replace(
new RegExp(Object.keys(wordsToNumbers).join("|"), "gi"),
(match) => String(wordsToNumbers[match]),
);
const solvePart1 = (data: string): number =>
data
.split("\n")
.filter(Boolean)
.map(getNumberStringsFromString)
.map((numbers) => [
numbers[0],
numbers[numbers.length - 1],
])
.map(([a, b]) => parseFloat(a + b))
.reduce((s, v) => s + v);
console.log("Sample:", solvePart1(sample)); // 142
console.log("Input", solvePart1(input)); // 55090
const solvePart2 = (data: string): number =>
data
.split("\n")
.filter(Boolean)
.map(getNumberStringsAndNumberWordsFromString)
.map((numbers) => numbers.map(replaceWordNumbersToNumbers))
.map((numbers) => [
numbers[0],
numbers[numbers.length - 1],
])
.map(([a, b]) => parseFloat(a + b))
.reduce((s, v) => s + v);
console.log("Sample2:", solvePart2(sample2)); //281
console.log("Input", solvePart2(input)); //54845