aboutsummaryrefslogtreecommitdiff
path: root/day9.zig
diff options
context:
space:
mode:
Diffstat (limited to 'day9.zig')
-rw-r--r--day9.zig53
1 files changed, 53 insertions, 0 deletions
diff --git a/day9.zig b/day9.zig
new file mode 100644
index 0000000..15863af
--- /dev/null
+++ b/day9.zig
@@ -0,0 +1,53 @@
+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)});
+}
+
+fn solve_pt1(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 nxt = nums.getLast() + try predictNext(a, nums);
+ // std.log.warn("nxt {}", .{nxt});
+ sum += nxt;
+ }
+ return sum;
+}
+
+// note uses recursion!
+fn predictNext(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]);
+ }
+ const nxt_diff = try predictNext(a, sublist);
+ return sublist.getLast() + nxt_diff;
+}
+
+fn readnums(a: std.mem.Allocator, input: []const u8) !std.ArrayList(i64) {
+ var toks = std.mem.tokenize(u8, input, " ");
+ var res = std.ArrayList(i64).init(a);
+ while (toks.next()) |tok| {
+ try res.append(try std.fmt.parseInt(i64, tok, 10));
+ }
+ return res;
+}
+
+test "pt1" {
+ try std.testing.expectEqual(@as(i64, 114), try solve_pt1(std.testing.allocator, test_input));
+}
+
+const test_input =
+ \\0 3 6 9 12 15
+ \\1 3 6 10 15 21
+ \\10 13 16 21 30 45
+;
+
+const puzzle_input = @embedFile("day9.in");