include "../lib/loop.hurl";
include "../lib/if.hurl";
println("AOC -- day 1.2");
let input = read_file("./aoc/input/day1.txt");
let lines = str_lines(input);
let word_numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
let is_number = func(line, index) {
let result = [false, 0];
if_else(func() {
hurl is_digit(at(line, index));
}, func() {
result = [true, as_num(at(line, index))];
}, func() {
try {
for(9, func(locals) {
let target = at(word_numbers, locals.1);
let slice = slice(line, index, index + len(target));
if(func() {
hurl slice == target;
}, func() {
result = [true, locals.1];
});
hurl [];
}, []);
} catch as default {
};
});
hurl result;
};
let extract_nums = func(line) {
let chars = str_chars(line);
let first = 0;
try {
until(func(locals) {
try {
is_number(line, locals.1);
} catch as result {
if(func() {
hurl result.1;
}, func() {
first = result.2;
});
hurl result.1;
};
}, func(locals) {
hurl [locals.1 + 1];
}, [0]);
} catch as val {
};
let last = 0;
try {
until(func(locals) {
try {
is_number(line, locals.1);
} catch as result {
if(func() {
hurl result.1;
}, func() {
last = result.2;
});
hurl result.1;
};
}, func(locals) {
hurl [locals.1 - 1];
}, [len(chars) + 1]);
} catch as val {
};
let first = "" + first;
let last = "" + last;
hurl as_num(first + last);
};
let total = 0;
for_each(lines, func(line) {
try {
extract_nums(line);
} catch as val {
total = total + val;
};
});
println("solution: ", total);