func concat[a: i64, b: i64] : i64 ab_str := _stackalloc(50) io.snprintf(ab_str, 50, "%d%d", a, b) return str.parse_i64(ab_str) func solve[ops: Array, e: Array] : i64 e_1 : Array = array.nth(e, 1) n := e_1->size - 1 indices := [] for i in 0..n array.push(indices, 0) while true res : i64 = array.nth(e_1, 0) for i in 0..n op : str = array.nth(ops, array.nth(indices, i)) if str.equal(op, "add") res = res + array.nth(e_1, i + 1) else if str.equal(op, "mul") res = res * array.nth(e_1, i + 1) else if str.equal(op, "concat") res = concat(res, array.nth(e_1, i + 1)) if res == array.nth(e, 0) return res done := true i := n - 1 while i >= 0 array.set(indices, i, array.nth(indices, i) + 1) if array.nth(indices, i) < ops->size done = false break array.set(indices, i, 0) i = i - 1 if done return 0 func part1[equations: Array] : void out := 0 for i in 0..equations->size out = out + solve(["add", "mul"], array.nth(equations, i)) io.println_i64(out) func part2[equations: Array] : void out := 0 for i in 0..equations->size out = out + solve(["add", "mul", "concat"], array.nth(equations, i)) io.println_i64(out) func main[] : i64 ~input, ok := io.read_text_file("input.txt") if !ok panic("failed to open input.txt") lines := str.split(input, "\n") equations := [] for i in 0..lines->size line : str = array.nth(lines, i) parts := str.split(line, ": ") xs := str.split(array.nth(parts, 1), " ") for j in 0..xs->size array.set(xs, j, str.parse_i64(array.nth(xs, j))) array.push(equations, [str.parse_i64(array.nth(parts, 0)), xs]) part1(equations) part2(equations)