use fmt; use io; use os; use sort; use sort::cmp; use strconv::{stou64}; use strings::{cut, fromutf8_unsafe, split}; fn cmpranges(a: const *opaque, b: const *opaque) int = { const a = *(a: const *(u64, u64)), b = *(b: const *(u64, u64)); return if (a.0 < b.0) -1 else if (a.0 > b.0) 1 else if (a.1 < b.1) -1 else if (a.1 > b.1) 1 else 0; }; fn fresh_ingredients(fresh_ranges: [](u64, u64)) u64 = { let ingredients: u64 = 0; sort::sort(fresh_ranges: []opaque, size((u64, u64)), &cmpranges)!; let i: size = 0; for (true) { for (true) { if (fresh_ranges[i].1 >= fresh_ranges[i + 1].0) { if (fresh_ranges[i].1 < fresh_ranges[i + 1].1) fresh_ranges[i].1 = fresh_ranges[i + 1].1; delete(fresh_ranges[i + 1]); } else break; }; if (i < len(fresh_ranges) - 2) i += 1 else break; }; for (let range .. fresh_ranges) { ingredients += (range.1 - range.0) + 1; }; free(fresh_ranges); return ingredients; }; 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")!; defer free(lines); let ranges: [](u64, u64) = []; for (let line .. lines) { if (line == "") break; let range = cut(line, "-"); let start = stou64(range.0)!; let end = stou64(range.1)!; append(ranges, (start, end))!; }; let answer = fresh_ingredients(ranges); fmt::printfln("Answer: {}", answer)!; };