advent-of-code-2023/src/day_one.ts

74 lines
1.6 KiB
TypeScript

import fs from 'fs';
const DIGIT_REGEX = new RegExp(/(?=(\d|one|two|three|four|five|six|seven|eight|nine))/g);
function parseDigit(digit: string): string {
switch (digit) {
case "one": return "1";
case "two": return "2";
case "three": return "3";
case "four": return "4";
case "five": return "5";
case "six": return "6";
case "seven": return "7";
case "eight": return "8";
case "nine": return "9";
default: return digit;
}
}
function parseLine(line: string): number {
const matches = line.matchAll(DIGIT_REGEX);
if (!matches) return 0;
const converted = [...matches].flatMap(((matchArray) => matchArray.map(parseDigit))).filter(digit => digit.length);
console.log(converted);
const str = `${converted[0]}${converted[converted.length - 1]}`;
const parsed = parseInt(str, 10);
if (isNaN(parsed)) {
return 0;
}
return parsed;
}
function calculateCalibration(lines: string[]): number {
return lines.reduce((calibration, line) => {
const parsed = parseLine(line);
if (isNaN(parsed)) {
return calibration;
}
return calibration + parsed;
}, 0);
}
function dayOne() {
const lines = fs.readFileSync("./inputs/day_one.txt").toString('utf-8').split('\n');
console.log(calculateCalibration(lines));
}
function test() {
const expected = 83;
const result = calculateCalibration([
'two1nine',
'eightwothree',
'abcone2threexyz',
'xtwone3four',
'4nineeightseven2',
'zoneight234',
'7pqrstsixteen',
'eighthree',
'sevenine'
])
if (result !== expected) {
throw new Error(`Expected ${expected} but got ${result}`);
}
}
test();
dayOne();