aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--day9.zig31
1 files changed, 31 insertions, 0 deletions
diff --git a/day9.zig b/day9.zig
index 15863af..d2a2dd6 100644
--- a/day9.zig
+++ b/day9.zig
@@ -2,6 +2,7 @@ const std = @import("std");
pub fn main() !void {
try std.fmt.format(std.io.getStdOut().writer(), "day 9 pt1: {}\n", .{try solve_pt1(std.heap.page_allocator, puzzle_input)});
+ try std.fmt.format(std.io.getStdOut().writer(), "day 9 pt2: {}\n", .{try solve_pt2(std.heap.page_allocator, puzzle_input)});
}
fn solve_pt1(a: std.mem.Allocator, input: []const u8) !i64 {
@@ -44,6 +45,36 @@ test "pt1" {
try std.testing.expectEqual(@as(i64, 114), try solve_pt1(std.testing.allocator, test_input));
}
+fn solve_pt2(a: std.mem.Allocator, input: []const u8) !i64 {
+ var sum: i64 = 0;
+ var spl = std.mem.split(u8, input, "\n");
+ while (spl.next()) |line| {
+ const nums = try readnums(a, line);
+ defer nums.deinit();
+ const prv = nums.items[0] - try predictPrev(a, nums);
+ // std.log.warn("prv {}", .{prv});
+ sum += prv;
+ }
+ return sum;
+}
+
+// note uses recursion!
+fn predictPrev(a: std.mem.Allocator, list: std.ArrayList(i64)) !i64 {
+ if (std.mem.allEqual(i64, list.items, 0)) {
+ return 0;
+ }
+ var sublist = std.ArrayList(i64).init(a);
+ defer sublist.deinit();
+ for (1..list.items.len) |ix| {
+ try sublist.append(list.items[ix] - list.items[ix - 1]);
+ }
+ return sublist.items[0] - try predictPrev(a, sublist);
+}
+
+test "pt2" {
+ try std.testing.expectEqual(@as(i64, 2), try solve_pt2(std.testing.allocator, test_input));
+}
+
const test_input =
\\0 3 6 9 12 15
\\1 3 6 10 15 21