import { readLines } from "fs";
type Digit = { symbol: String, name: String, value: Int };
fix digits = [
Digit{ symbol: "1", name: "one", value: 1 },
Digit{ symbol: "2", name: "two", value: 2 },
Digit{ symbol: "3", name: "three", value: 3 },
Digit{ symbol: "4", name: "four", value: 4 },
Digit{ symbol: "5", name: "five", value: 5 },
Digit{ symbol: "6", name: "six", value: 6 },
Digit{ symbol: "7", name: "seven", value: 7 },
Digit{ symbol: "8", name: "eight", value: 8 },
Digit{ symbol: "9", name: "nine", value: 9 },
];
fix readDigit = fn(line: String): Int? => {
for Digit{ symbol, name, value } in digits {
if (line.startsWith(symbol) or line.startsWith(name)) {
return value;
};
};
None;
};
fix extractValue = fn(line: String): Int => {
mut firstDigit: Int? = None;
mut lastDigit: Int? = None;
mut rest = line;
while (not rest.isEmpty()) {
fix digit = readDigit(rest);
if (digit != None) {
lastDigit = digit;
if (firstDigit == None) {
firstDigit = digit;
};
};
rest = rest.drop(1);
};
(firstDigit ?? 0) * 10 + (lastDigit ?? 0);
};
fix lines = try await readLines!("input.txt");
mut sum = 0;
for line in lines {
fix value = extractValue(line);
sum = sum + value;
};
sum