summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Segundo2022-12-09 13:49:31 +0100
committerChristian Segundo2022-12-09 19:12:08 +0100
commitf88650ccc3980ceef9ffd7fdf57519d249ae89df (patch)
treecd0df095ba5f851cd19b5e70382dde55df662109
parent4faf4ac6c6c11d38bce5758d0fb29e38adc0991b (diff)
downloadadvent-of-zig-2022-f88650ccc3980ceef9ffd7fdf57519d249ae89df.tar.gz
day 9
-rw-r--r--day_09.zig141
-rw-r--r--inputs/day_092000
-rw-r--r--main.zig1
3 files changed, 2142 insertions, 0 deletions
diff --git a/day_09.zig b/day_09.zig
new file mode 100644
index 0000000..da50864
--- /dev/null
+++ b/day_09.zig
@@ -0,0 +1,141 @@
+const std = @import("std");
+const Result = @import("util/aoc.zig").Result;
+
+const GRID_SIZE = [_]usize{ 500, 500 };
+
+const Rope = struct {
+ grid: [GRID_SIZE[0]][GRID_SIZE[1]]i16,
+ head_position: *[2]i16 = undefined,
+ tail_position: *[2]i16 = undefined,
+
+ knots: [][2]i16,
+
+ tail_visits: [GRID_SIZE[0]][GRID_SIZE[1]]u2,
+
+ allocator: std.mem.Allocator,
+
+ const start_position = [2]i16{ GRID_SIZE[0] / 2 - 1, GRID_SIZE[1] / 2 - 1 };
+
+ // in theory? knots can be comptime
+ fn init(allocator: std.mem.Allocator, knots: usize) Rope {
+ var k = allocator.alloc([2]i16, knots + 2) catch unreachable;
+ for (k) |_, i| k[i] = Rope.start_position;
+
+ var rope = Rope{
+ .knots = k,
+ .grid = std.mem.zeroes([GRID_SIZE[0]][GRID_SIZE[1]]i16),
+ .tail_visits = std.mem.zeroes([GRID_SIZE[0]][GRID_SIZE[1]]u2),
+ .allocator = allocator,
+ };
+
+ rope.tail_position = &rope.knots[k.len - 1];
+ rope.head_position = &rope.knots[0];
+
+ return rope;
+ }
+
+ fn deinit(self: *Rope) void {
+ self.allocator.free(self.knots);
+ }
+
+ fn sync(self: *Rope) void {
+ for (self.knots[0..self.knots.len]) |*knot, knot_idx| {
+ if (knot_idx == 0) continue;
+
+ const previous_knot = self.knots[knot_idx - 1];
+ const delta = [2]i16{ previous_knot[0] - knot[0], previous_knot[1] - knot[1] };
+
+ if (std.math.absCast(delta[0]) == 2 and std.math.absCast(delta[1]) == 0) {
+ knot[0] += std.math.divExact(i16, delta[0], 2) catch unreachable;
+ } else if (std.math.absCast(delta[0]) == 0 and std.math.absCast(delta[1]) == 2) {
+ knot[1] += std.math.divExact(i16, delta[1], 2) catch unreachable;
+ } else if (std.math.absCast(delta[0]) == 2 and std.math.absCast(delta[1]) == 2) {
+ knot[0] += std.math.divExact(i16, delta[0], 2) catch unreachable;
+ knot[1] += std.math.divExact(i16, delta[1], 2) catch unreachable;
+ } else if (std.math.absCast(delta[0]) == 1 and std.math.absCast(delta[1]) == 2) {
+ knot[0] += delta[0];
+ knot[1] += std.math.divExact(i16, delta[1], 2) catch unreachable;
+ } else if (std.math.absCast(delta[0]) == 2 and std.math.absCast(delta[1]) == 1) {
+ knot[0] += std.math.divExact(i16, delta[0], 2) catch unreachable;
+ knot[1] += delta[1];
+ }
+ }
+
+ self.tail_visits[@intCast(usize, self.tail_position.*[0])][@intCast(usize, self.tail_position.*[1])] = 1;
+ return;
+ }
+
+ fn up(self: *Rope) void {
+ self.head_position.*[0] -= 1;
+ self.sync();
+ }
+
+ fn down(self: *Rope) void {
+ self.head_position.*[0] += 1;
+ self.sync();
+ }
+
+ fn left(self: *Rope) void {
+ self.head_position.*[1] -= 1;
+ self.sync();
+ }
+
+ fn right(self: *Rope) void {
+ self.head_position.*[1] += 1;
+ self.sync();
+ }
+};
+
+pub fn puzzle_1(allocator: std.mem.Allocator, input: []const u8) Result {
+ var rope = Rope.init(allocator, 0);
+ defer rope.deinit();
+
+ var iter = std.mem.split(u8, input, "\n");
+ while (iter.next()) |line| {
+ const n = std.fmt.parseInt(u8, line[2..], 0) catch unreachable;
+ var i: usize = 0;
+ switch (line[0]) {
+ 'R' => while (i < n) : (i += 1) rope.right(),
+ 'L' => while (i < n) : (i += 1) rope.left(),
+ 'U' => while (i < n) : (i += 1) rope.up(),
+ 'D' => while (i < n) : (i += 1) rope.down(),
+ else => unreachable,
+ }
+ }
+
+ var i: u16 = 0;
+ for (rope.tail_visits) |_, x| {
+ for (rope.tail_visits[x]) |n| {
+ if (n == 1) i += 1;
+ }
+ }
+
+ return .{ .int = i };
+}
+
+pub fn puzzle_2(allocator: std.mem.Allocator, input: []const u8) Result {
+ var rope = Rope.init(allocator, 8);
+ defer rope.deinit();
+
+ var iter = std.mem.split(u8, input, "\n");
+ while (iter.next()) |line| {
+ const n = std.fmt.parseInt(u8, line[2..], 0) catch unreachable;
+ var i: usize = 0;
+ switch (line[0]) {
+ 'R' => while (i < n) : (i += 1) rope.right(),
+ 'L' => while (i < n) : (i += 1) rope.left(),
+ 'U' => while (i < n) : (i += 1) rope.up(),
+ 'D' => while (i < n) : (i += 1) rope.down(),
+ else => unreachable,
+ }
+ }
+
+ var i: u16 = 0;
+ for (rope.tail_visits) |_, x| {
+ for (rope.tail_visits[x]) |n| {
+ if (n == 1) i += 1;
+ }
+ }
+
+ return .{ .int = i };
+}
diff --git a/inputs/day_09 b/inputs/day_09
new file mode 100644
index 0000000..e54f034
--- /dev/null
+++ b/inputs/day_09
@@ -0,0 +1,2000 @@
+U 1
+R 2
+D 1
+L 1
+U 2
+D 1
+U 2
+L 1
+D 1
+U 2
+R 1
+U 1
+D 1
+R 1
+L 2
+D 1
+U 1
+D 1
+U 2
+D 2
+R 2
+D 1
+R 2
+D 2
+R 1
+L 2
+U 2
+D 2
+R 2
+D 1
+R 1
+L 1
+D 2
+U 2
+L 2
+U 2
+R 1
+L 1
+D 1
+R 1
+D 2
+U 1
+L 2
+R 1
+U 1
+D 1
+U 1
+D 2
+R 1
+L 1
+U 1
+L 1
+R 2
+U 1
+R 2
+L 2
+U 1
+R 1
+L 2
+R 2
+L 2
+U 1
+D 1
+U 2
+R 1
+D 1
+L 2
+D 1
+L 1
+U 1
+R 2
+U 1
+D 1
+L 2
+R 2
+D 2
+R 2
+D 1
+L 2
+D 1
+R 2
+L 1
+D 2
+R 2
+D 1
+U 1
+L 1
+R 2
+L 2
+D 1
+R 1
+L 1
+U 1
+L 1
+R 1
+U 2
+R 1
+D 2
+R 1
+L 2
+R 1
+L 1
+D 2
+R 2
+L 1
+U 1
+D 1
+L 2
+D 1
+L 1
+R 1
+U 1
+R 3
+U 2
+L 2
+R 1
+L 1
+D 1
+R 1
+U 2
+D 3
+L 1
+R 1
+U 2
+R 1
+U 1
+R 3
+L 3
+U 2
+D 1
+L 1
+R 1
+U 3
+D 1
+L 3
+D 2
+U 3
+R 3
+D 1
+L 3
+D 1
+U 1
+R 3
+L 2
+U 1
+R 3
+U 3
+L 3
+D 1
+R 2
+U 3
+R 2
+L 1
+U 3
+L 3
+R 3
+D 2
+U 1
+L 1
+D 1
+U 3
+D 1
+U 2
+R 1
+L 2
+R 2
+L 2
+D 3
+R 2
+D 2
+U 1
+L 2
+R 2
+L 1
+U 3
+D 3
+R 1
+L 1
+D 3
+L 2
+U 2
+R 3
+L 1
+D 2
+L 1
+R 2
+L 2
+U 2
+D 3
+R 2
+U 3
+D 1
+L 2
+D 3
+U 1
+R 3
+U 1
+R 2
+U 2
+D 1
+L 1
+D 3
+L 2
+U 1
+R 1
+L 1
+U 2
+D 3
+U 3
+R 3
+U 1
+R 1
+D 2
+R 1
+L 2
+D 2
+U 1
+R 3
+D 2
+U 2
+L 2
+R 3
+D 2
+U 1
+R 1
+L 3
+R 1
+U 1
+R 4
+L 2
+R 3
+D 3
+L 3
+D 3
+R 3
+L 2
+R 4
+D 1
+R 2
+U 3
+D 4
+U 2
+R 4
+U 2
+R 3
+L 2
+D 1
+U 3
+D 1
+L 4
+U 4
+D 4
+R 2
+U 1
+L 2
+R 2
+L 4
+R 3
+U 4
+D 3
+R 2
+L 2
+R 2
+D 2
+U 1
+R 2
+U 3
+R 4
+D 1
+L 4
+U 2
+R 3
+U 3
+R 4
+L 1
+D 3
+R 3
+D 4
+R 2
+L 3
+R 1
+D 4
+R 2
+L 2
+U 3
+R 3
+U 2
+R 3
+U 4
+R 1
+L 1
+D 4
+U 4
+D 3
+L 1
+D 3
+L 2
+U 2
+R 2
+D 3
+R 2
+U 1
+R 4
+D 3
+L 2
+D 1
+L 4
+D 1
+R 4
+D 4
+R 1
+U 3
+L 2
+U 1
+R 3
+U 2
+L 3
+D 1
+U 4
+L 2
+D 1
+L 2
+R 3
+U 4
+R 1
+U 1
+L 3
+U 4
+D 3
+L 2
+D 1
+L 3
+R 2
+D 4
+L 1
+D 5
+U 4
+D 2
+R 1
+D 3
+L 3
+R 1
+D 5
+U 3
+D 5
+L 2
+D 1
+L 3
+R 5
+U 4
+L 3
+D 4
+U 5
+D 5
+L 2
+U 5
+L 2
+R 3
+L 1
+U 2
+D 4
+R 3
+D 4
+U 5
+D 3
+U 4
+L 4
+R 1
+L 5
+U 5
+R 2
+U 4
+R 3
+D 1
+U 1
+R 2
+U 4
+R 2
+D 2
+U 1
+R 1
+L 2
+D 1
+U 5
+L 4
+R 2
+D 1
+U 1
+D 2
+U 2
+D 5
+L 2
+R 5
+U 5
+L 5
+D 2
+L 1
+U 3
+D 1
+R 3
+D 2
+L 3
+R 3
+D 3
+R 2
+L 1
+D 1
+U 2
+R 2
+L 2
+R 5
+U 4
+D 3
+L 4
+U 4
+D 1
+U 4
+D 2
+U 5
+L 4
+R 5
+D 4
+R 2
+D 2
+R 5
+D 4
+U 1
+D 3
+U 5
+R 3
+D 2
+R 5
+L 1
+U 5
+R 5
+U 1
+R 3
+U 3
+R 4
+U 1
+L 4
+R 1
+U 3
+L 2
+U 6
+D 4
+U 3
+D 1
+R 2
+L 6
+U 3
+D 4
+U 1
+L 6
+U 1
+R 1
+U 6
+D 5
+U 5
+R 4
+U 1
+L 4
+D 1
+U 5
+R 3
+L 2
+U 3
+L 6
+R 5
+U 4
+R 5
+D 1
+L 6
+U 3
+L 5
+U 2
+L 5
+R 2
+U 6
+R 6
+D 1
+R 1
+U 3
+R 6
+U 5
+L 4
+U 2
+R 5
+L 2
+U 1
+D 1
+U 5
+R 2
+U 2
+L 4
+R 2
+D 1
+L 4
+U 1
+L 6
+R 6
+U 2
+D 5
+U 5
+D 4
+L 1
+R 3
+L 5
+U 6
+R 4
+D 1
+U 2
+R 1
+D 3
+R 1
+L 5
+D 3
+R 3
+U 5
+L 6
+R 3
+U 5
+L 2
+U 3
+R 3
+D 3
+U 1
+L 2
+U 2
+L 3
+D 6
+L 3
+D 4
+R 4
+D 4
+U 6
+L 6
+D 2
+R 1
+U 3
+L 6
+R 4
+D 1
+L 2
+U 4
+L 6
+U 1
+L 4
+D 1
+L 3
+R 2
+L 1
+R 2
+L 3
+R 1
+U 7
+D 7
+L 7
+U 1
+R 2
+U 6
+R 4
+L 6
+U 3
+R 4
+U 7
+D 5
+R 6
+U 6
+L 6
+R 4
+D 1
+U 3
+R 5
+L 2
+D 2
+U 5
+L 1
+D 3
+R 5
+L 2
+U 4
+D 1
+R 5
+U 2
+R 4
+L 3
+R 4
+L 2
+D 2
+L 4
+D 1
+U 4
+D 4
+R 4
+L 5
+R 2
+D 2
+L 2
+D 1
+L 2
+D 1
+L 4
+D 5
+R 7
+U 7
+L 2
+D 3
+L 4
+R 7
+D 7
+U 2
+D 7
+L 6
+D 3
+U 5
+R 5
+D 3
+U 7
+D 3
+L 5
+D 3
+R 4
+D 4
+L 7
+D 6
+U 2
+L 3
+R 6
+U 5
+R 7
+U 3
+L 1
+R 7
+U 2
+R 4
+L 7
+U 2
+D 4
+U 5
+D 6
+U 4
+D 6
+U 7
+R 1
+L 4
+R 3
+L 6
+U 4
+R 7
+L 6
+U 7
+D 1
+U 7
+D 4
+L 1
+D 3
+R 6
+U 3
+R 5
+L 4
+R 4
+L 4
+U 7
+R 3
+L 4
+D 7
+R 6
+U 2
+L 3
+U 8
+D 3
+U 4
+D 1
+R 4
+U 5
+R 2
+U 4
+D 8
+L 2
+D 8
+R 4
+L 1
+R 7
+L 6
+U 4
+L 4
+D 7
+L 3
+D 2
+U 8
+R 8
+U 6
+R 7
+D 3
+U 7
+R 1
+L 8
+D 2
+L 3
+R 5
+D 3
+U 3
+R 8
+L 1
+R 6
+L 8
+U 2
+D 4
+R 6
+L 6
+D 5
+U 4
+L 6
+U 1
+L 6
+U 3
+D 5
+U 5
+L 6
+D 8
+R 5
+D 4
+R 6
+U 7
+L 1
+D 2
+R 2
+L 7
+R 4
+D 7
+L 3
+U 6
+R 7
+D 3
+L 3
+D 2
+U 1
+R 3
+L 8
+U 8
+D 5
+L 6
+R 3
+L 6
+D 3
+R 4
+U 3
+L 8
+D 7
+L 6
+R 5
+D 6
+R 6
+D 3
+L 4
+R 1
+D 6
+U 3
+R 1
+D 5
+U 4
+L 1
+R 2
+U 6
+D 6
+R 7
+L 1
+R 6
+U 7
+D 8
+R 2
+U 3
+L 6
+U 2
+D 6
+U 8
+L 3
+U 4
+D 6
+R 6
+L 5
+U 9
+R 8
+L 2
+D 6
+R 3
+L 4
+D 2
+L 7
+D 5
+L 7
+U 8
+D 6
+L 9
+D 3
+L 5
+U 3
+L 8
+D 7
+R 8
+U 2
+L 9
+U 7
+D 7
+U 6
+D 5
+R 2
+D 8
+R 9
+U 4
+R 1
+L 3
+D 7
+R 2
+L 6
+U 1
+L 7
+D 8
+U 9
+R 9
+D 1
+U 9
+D 1
+R 1
+D 6
+R 7
+D 1
+L 1
+R 6
+U 3
+R 7
+U 2
+R 5
+U 6
+R 2
+L 7
+R 8
+D 9
+U 5
+L 9
+R 9
+U 2
+L 7
+R 4
+U 3
+R 6
+L 6
+D 7
+L 4
+R 7
+D 5
+L 5
+D 7
+U 8
+R 8
+L 8
+R 5
+D 5
+U 2
+R 1
+U 5
+R 6
+L 8
+U 9
+R 4
+D 9
+R 4
+D 3
+U 8
+R 8
+U 9
+L 6
+D 9
+R 6
+U 5
+R 1
+U 1
+L 9
+U 8
+L 1
+U 5
+L 1
+D 7
+R 6
+U 1
+D 3
+R 2
+D 3
+R 8
+D 2
+U 4
+R 8
+L 9
+D 2
+U 2
+R 4
+D 10
+L 4
+U 3
+D 6
+R 4
+U 8
+L 8
+U 3
+L 10
+D 7
+U 2
+L 6
+R 2
+U 8
+L 10
+U 7
+D 8
+L 7
+U 10
+R 4
+U 1
+L 1
+D 4
+U 10
+D 9
+U 4
+L 10
+R 4
+D 5
+U 8
+D 1
+R 5
+D 10
+L 8
+D 1
+U 2
+L 7
+U 1
+L 6
+D 2
+R 3
+L 3
+U 5
+R 9
+U 10
+D 5
+U 7
+L 3
+R 5
+U 7
+L 4
+U 1
+D 2
+U 8
+L 8
+U 7
+R 9
+L 1
+D 10
+R 8
+L 4
+U 4
+L 10
+R 2
+L 3
+D 7
+L 10
+R 6
+U 5
+D 4
+U 6
+R 10
+D 8
+U 3
+L 1
+R 1
+D 2
+R 1
+U 1
+R 5
+U 9
+R 6
+U 10
+L 2
+U 5
+L 7
+R 8
+U 10
+D 6
+L 3
+U 2
+L 4
+R 6
+L 5
+D 9
+U 3
+D 3
+R 10
+L 10
+D 4
+R 7
+D 7
+U 3
+L 5
+R 5
+L 9
+R 2
+U 8
+R 10
+U 10
+L 4
+U 1
+D 2
+U 5
+L 11
+R 3
+L 10
+U 7
+D 6
+U 11
+D 11
+U 2
+L 7
+D 11
+U 8
+L 5
+U 7
+L 10
+D 7
+L 2
+U 5
+D 4
+R 9
+L 10
+D 1
+U 6
+R 2
+L 7
+U 1
+R 4
+D 11
+U 2
+R 9
+U 11
+R 6
+U 9
+L 9
+D 3
+R 6
+L 4
+R 1
+L 5
+R 2
+U 3
+R 1
+U 7
+D 1
+R 11
+L 2
+D 7
+L 10
+U 1
+R 8
+L 6
+U 7
+D 11
+R 1
+U 11
+L 8
+D 6
+R 6
+D 10
+U 2
+D 1
+L 6
+R 9
+L 8
+U 10
+R 4
+U 4
+R 9
+D 3
+R 8
+D 11
+L 4
+U 8
+D 6
+R 1
+U 5
+L 8
+U 6
+R 9
+U 1
+R 8
+D 6
+R 4
+D 7
+R 7
+L 1
+D 6
+L 3
+D 9
+L 10
+D 5
+U 10
+L 11
+D 5
+U 9
+R 10
+L 11
+R 1
+U 6
+L 4
+U 7
+R 9
+L 10
+D 9
+R 5
+L 2
+D 1
+U 12
+L 7
+D 9
+U 8
+R 12
+L 11
+D 12
+L 4
+D 10
+U 7
+L 5
+U 6
+L 5
+R 3
+L 9
+U 7
+L 8
+U 10
+L 8
+R 1
+U 3
+D 6
+L 12
+U 6
+D 7
+L 7
+U 2
+D 8
+U 10
+L 12
+R 5
+L 7
+R 11
+D 5
+L 2
+R 10
+L 7
+U 9
+D 6
+R 3
+U 9
+L 1
+U 2
+D 9
+U 1
+D 2
+L 11
+R 4
+D 4
+L 6
+R 10
+L 6
+U 10
+L 2
+D 3
+R 12
+L 5
+R 5
+L 9
+D 6
+R 12
+U 6
+R 6
+D 6
+R 3
+L 12
+D 12
+L 10
+R 7
+U 7
+L 8
+R 6
+L 5
+D 3
+L 5
+U 12
+L 6
+U 10
+D 11
+U 11
+D 1
+U 9
+R 8
+L 8
+U 5
+R 3
+L 4
+R 6
+U 10
+L 1
+D 1
+R 7
+D 8
+L 1
+D 6
+R 3
+U 2
+D 4
+L 10
+D 9
+L 12
+U 6
+D 9
+U 8
+D 8
+L 8
+U 1
+D 6
+U 6
+D 4
+R 9
+L 5
+U 6
+R 7
+U 6
+D 3
+U 6
+D 10
+U 1
+L 13
+D 4
+U 6
+L 10
+R 6
+D 7
+U 9
+R 2
+L 5
+D 4
+U 10
+D 7
+L 12
+D 2
+R 1
+D 4
+R 1
+U 6
+L 9
+D 12
+U 8
+L 6
+U 4
+R 2
+L 1
+D 12
+U 12
+L 1
+D 7
+L 3
+R 10
+L 10
+U 2
+D 8
+R 5
+U 2
+L 5
+R 8
+L 5
+D 9
+L 11
+U 1
+D 6
+R 11
+D 11
+L 6
+R 13
+L 8
+U 7
+R 11
+L 9
+D 5
+L 2
+U 1
+D 13
+R 3
+D 2
+R 9
+U 3
+R 8
+D 10
+U 5
+D 3
+L 2
+D 9
+R 10
+D 4
+U 13
+D 10
+U 2
+R 8
+D 9
+R 13
+U 4
+D 3
+L 6
+U 8
+L 3
+R 3
+D 4
+U 6
+L 7
+R 3
+L 1
+D 1
+R 5
+U 8
+D 8
+U 11
+R 5
+U 2
+R 10
+L 3
+D 4
+U 1
+R 9
+L 7
+R 6
+L 13
+U 8
+L 8
+D 5
+R 10
+L 9
+U 7
+L 9
+U 9
+L 7
+R 5
+L 5
+U 7
+D 12
+U 7
+D 6
+R 14
+D 5
+L 11
+R 6
+L 4
+U 8
+R 9
+U 7
+R 12
+L 10
+U 10
+L 11
+R 7
+D 11
+R 7
+L 4
+D 9
+L 13
+R 6
+L 13
+D 2
+R 13
+D 12
+R 4
+U 11
+R 4
+D 3
+R 3
+L 12
+R 3
+D 11
+R 7
+D 7
+R 3
+U 4
+R 12
+D 14
+R 3
+L 10
+U 9
+L 2
+U 14
+L 2
+D 7
+U 10
+D 4
+U 6
+L 1
+D 11
+R 10
+D 1
+L 2
+U 9
+L 6
+R 12
+D 11
+R 8
+U 7
+D 2
+U 4
+D 12
+L 1
+U 8
+D 14
+R 2
+D 13
+R 10
+D 10
+R 14
+L 4
+D 14
+L 6
+R 13
+L 12
+U 4
+R 13
+L 12
+D 14
+L 1
+U 1
+L 4
+D 14
+R 12
+D 6
+U 11
+L 12
+U 2
+R 8
+D 14
+U 13
+D 6
+L 7
+D 4
+U 3
+L 8
+U 2
+D 12
+L 13
+U 8
+R 4
+D 10
+L 10
+U 5
+D 3
+L 10
+D 13
+R 15
+U 9
+L 10
+D 1
+U 11
+D 7
+U 3
+R 6
+L 11
+D 4
+R 8
+D 3
+U 7
+D 6
+L 11
+D 14
+R 15
+L 14
+D 2
+L 11
+R 13
+U 4
+D 13
+L 6
+D 4
+L 15
+D 5
+L 6
+U 8
+R 13
+L 5
+U 4
+R 9
+L 13
+D 3
+U 11
+R 6
+L 14
+R 9
+U 5
+D 5
+U 9
+D 12
+R 11
+U 8
+D 1
+R 2
+U 6
+R 11
+L 4
+R 7
+D 6
+U 6
+D 1
+L 4
+R 14
+D 11
+R 3
+U 9
+D 15
+L 14
+D 9
+R 4
+U 14
+R 3
+L 14
+D 15
+L 12
+R 5
+D 6
+U 15
+D 13
+U 10
+R 4
+D 3
+R 11
+U 11
+R 4
+L 1
+D 11
+U 14
+D 1
+U 14
+R 1
+L 14
+D 4
+U 12
+D 9
+L 13
+U 10
+D 14
+L 4
+U 15
+L 12
+U 3
+D 6
+U 1
+D 2
+R 13
+L 12
+U 2
+L 12
+D 7
+L 3
+U 15
+L 5
+R 9
+L 12
+U 1
+L 16
+D 4
+L 5
+U 16
+R 6
+D 4
+U 6
+R 3
+L 1
+D 7
+L 4
+D 1
+U 5
+D 1
+L 6
+R 2
+L 8
+R 3
+L 12
+D 15
+R 9
+L 5
+U 12
+L 5
+U 9
+R 14
+D 16
+R 13
+L 12
+U 3
+L 16
+D 3
+R 6
+U 2
+R 4
+D 2
+L 6
+D 15
+L 11
+D 6
+U 9
+D 13
+U 7
+L 10
+D 12
+L 4
+R 9
+U 5
+R 9
+U 16
+R 15
+D 10
+R 14
+L 8
+U 8
+D 8
+R 13
+U 6
+R 5
+D 9
+L 11
+R 1
+D 4
+L 3
+D 1
+U 11
+R 2
+L 7
+R 14
+D 5
+R 16
+U 11
+L 2
+D 1
+U 4
+R 15
+L 13
+R 3
+U 1
+R 1
+U 3
+R 16
+D 1
+L 4
+R 9
+L 3
+D 14
+R 15
+D 13
+U 13
+D 5
+U 8
+L 3
+U 6
+D 10
+U 6
+D 2
+U 13
+R 5
+L 16
+R 16
+U 12
+R 10
+D 13
+L 1
+D 13
+R 15
+D 7
+R 7
+U 16
+R 10
+U 7
+L 14
+D 4
+L 6
+U 9
+L 15
+R 6
+L 14
+D 5
+R 6
+D 5
+L 6
+R 1
+U 13
+L 15
+R 14
+L 12
+D 2
+L 1
+U 1
+R 13
+L 11
+R 15
+D 17
+L 13
+R 8
+D 14
+R 2
+D 1
+R 3
+U 8
+R 8
+L 14
+D 6
+U 3
+D 9
+R 12
+L 13
+U 2
+D 8
+U 15
+D 16
+L 5
+D 7
+U 15
+R 7
+L 5
+R 13
+D 4
+L 7
+R 1
+D 7
+L 11
+R 2
+U 17
+L 6
+U 15
+D 5
+R 17
+D 12
+U 17
+L 3
+R 15
+U 7
+L 2
+R 5
+D 17
+L 12
+U 10
+D 5
+L 16
+R 17
+D 2
+R 15
+D 4
+U 1
+D 5
+U 10
+L 8
+U 16
+D 2
+L 11
+R 7
+U 15
+L 15
+D 2
+L 8
+R 3
+U 8
+R 7
+U 6
+L 17
+U 8
+R 6
+L 13
+R 6
+D 13
+L 9
+U 2
+R 7
+D 14
+L 10
+U 8
+D 10
+U 4
+R 3
+L 1
+D 5
+U 18
+L 1
+U 9
+D 4
+R 3
+D 11
+R 9
+U 18
+D 12
+R 13
+L 8
+D 6
+U 13
+R 6
+U 15
+R 14
+U 11
+R 11
+D 15
+L 7
+R 11
+D 16
+U 14
+R 15
+D 16
+R 3
+D 10
+R 6
+U 17
+L 9
+R 1
+D 12
+R 18
+U 11
+L 2
+R 5
+L 10
+U 13
+L 3
+D 15
+U 14
+D 13
+R 5
+U 15
+L 9
+U 6
+D 16
+L 1
+U 1
+D 12
+R 18
+L 13
+R 10
+U 14
+L 13
+U 3
+L 2
+R 11
+U 18
+D 14
+R 4
+L 6
+R 10
+U 18
+L 18
+R 9
+L 11
+U 4
+D 5
+L 15
+R 13
+L 18
+U 16
+L 1
+R 12
+U 17
+D 11
+U 1
+L 13
+U 7
+D 3
+U 5
+R 8
+D 4
+L 7
+D 17
+U 9
+R 1
+L 18
+U 13
+L 7
+U 12
+D 2
+R 18
+D 12
+U 11
+R 13
+U 12
+L 13
+R 7
+U 6
+D 5
+L 13
+D 15
+R 12
+D 8
+L 19
+U 10
+L 4
+D 18
+U 9
+D 5
+U 2
+L 1
+D 2
+R 8
+U 9
+R 1
+D 11
+U 18
+R 11
+D 19
+U 6
+D 14
+U 6
+D 4
+U 2
+L 12
+D 15
+L 10
+R 5
+U 16
+L 3
+D 8
+L 10
+D 7
+R 16
+D 8
+R 6
+L 16
+R 6
+D 8
+U 15
+D 1
+L 14
+U 14
+R 16
+L 14
+D 2
+R 6
+D 5
+R 14
+L 15
+D 2
+R 15
+L 4
+U 18
+R 8
+D 6
+R 7
+L 2
+U 5
+L 19
+R 17
+L 19
+R 13
+L 2
+U 7
+D 19
+R 9
+L 8
+D 18
+U 2
+R 3
+U 7
+D 9
+R 12
+U 13
+L 15
+U 2
+D 6
+R 18
+D 7
+L 10
+R 4
+L 12
+D 6
+L 4
+D 10
+L 7
+U 12
+L 9
+R 12
+L 13
+R 13
+L 18
+R 18
+U 7
+D 5
+R 8
+D 18
+L 11
+D 5
+L 1
+U 6
+R 19
+U 17
+R 16
+L 8
+R 11
+U 17
+D 1
+R 11
+L 12
+D 4
+U 13
diff --git a/main.zig b/main.zig
index 4c015fa..5108467 100644
--- a/main.zig
+++ b/main.zig
@@ -14,6 +14,7 @@ const t = [_]struct {
.{ .day = @import("day_06.zig"), .input = @embedFile("inputs/day_06"), .expect = &[_]Result{ .{ .int = 1896 }, .{ .int = 3452 } } },
.{ .day = @import("day_07.zig"), .input = @embedFile("inputs/day_07"), .expect = &[_]Result{ .{ .int = 1427048 }, .{ .int = 2940614 } } },
.{ .day = @import("day_08.zig"), .input = @embedFile("inputs/day_08"), .expect = &[_]Result{ .{ .int = 1859 }, .{ .int = 332640 } } },
+ .{ .day = @import("day_09.zig"), .input = @embedFile("inputs/day_09"), .expect = &[_]Result{ .{ .int = 6087 }, .{ .int = 2493 } } },
};
pub fn main() !void {