const std = @import("std"); const print = std.debug.print; const assert = std.debug.assert; const ArrayList = std.ArrayList; const HashMap = std.HashMap; const mem = std.mem; const fin = mem.trim(u8, @embedFile("./input.txt"), &std.ascii.whitespace); var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); fn evaluate(list: []const i64) struct { i64, i64 } { if (mem.allEqual(i64, list, 0)) { return .{ 0, 0 }; } const n = list.len; var derivative = ArrayList(i64).init(allocator); defer derivative.deinit(); for (list[0 .. n - 1], list[1..n]) |curr, next| { derivative.append(next - curr) catch unreachable; } const e = evaluate(derivative.items); return .{ list[n - 1] + e, list[0] - e }; } pub fn solve(listNums: ArrayList(ArrayList(i64))) void { var part1: i64 = 0; var part2: i64 = 0; for (listNums.items) |list| { const e = evaluate(list.items); part1 += e[0]; part2 += e[1]; } print("{d}\n{d}\n", .{ part1, part2 }); } pub fn main() !void { var splitLines = mem.splitScalar(u8, fin, '\n'); var listNums = ArrayList(ArrayList(i64)).init(allocator); while (splitLines.next()) |line| { var listText = mem.tokenizeScalar(u8, line, ' '); var row = ArrayList(i64).init(allocator); while (listText.next()) |n| { try row.append(try std.fmt.parseInt(i64, n, 10)); } try listNums.append(row); } solve(listNums); }