use errors; use fmt; use io; use os; use strconv::{stoi}; use strings::{dupall, freeall, fromutf8_unsafe, split}; fn solve(problems: []([32]int, str)) (u64 | errors::invalid) = { let result = 0u64; for (let (numbers, operation) .. problems) { let problem_result = 1u64; if (operation == "*") { for (let number .. numbers) { if (number == 0) break; problem_result *= number: u64; }; } else if (operation == "+") { problem_result = 0; for (let number .. numbers) { if (number == 0) break; problem_result += number: u64; }; } else return errors::invalid; result += problem_result; }; return result; }; export fn main() void = { let handle = os::open("input.txt")!; defer io::close(handle)!; let buf = io::drain(handle)!; defer free(buf); let lines = split(fromutf8_unsafe(buf), "\n")!; delete(lines[len(lines) - 1]); defer free(lines); let problems: []([32]int, str) = []; defer free(problems); for (let i = 0z; i < len(lines); i += 1) { let values = split(lines[i], " ")!; defer free(values); let value_offset = 0z; for (let j = 0z; j < len(values); j += 1) { if (values[j] == "") { value_offset += 1; continue; }; if (i == 0) { append(problems, ([0...], " "))!; problems[j - value_offset].0[i] = stoi(values[j])!; } else if (i == len(lines) - 1) { problems[j - value_offset].1 = values[j]; } else { problems[j - value_offset].0[i] = stoi(values[j])!; }; }; }; let answer = solve(problems)!; fmt::printfln("Answer: {}", answer)!; };