const sample = await Deno.readTextFile("sample.txt"); const sample2 = await Deno.readTextFile("sample2.txt"); const input = await Deno.readTextFile("input.txt"); const wordsToNumbers: Record = { 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