about summary refs log tree commit diff
path: root/aoc/2021/13/part-two.zig
diff options
context:
space:
mode:
Diffstat (limited to 'aoc/2021/13/part-two.zig')
-rw-r--r--aoc/2021/13/part-two.zig31
1 files changed, 31 insertions, 0 deletions
diff --git a/aoc/2021/13/part-two.zig b/aoc/2021/13/part-two.zig
new file mode 100644
index 0000000..f42ebff
--- /dev/null
+++ b/aoc/2021/13/part-two.zig
@@ -0,0 +1,31 @@
+const min = std.math.min;
+const parseUnsigned = std.fmt.parseUnsigned;
+const print = std.debug.print;
+const split = std.mem.split;
+const std = @import("std");
+const tokenize = std.mem.tokenize;
+
+const Dot = struct { x: u12, y: u12 };
+inline fn mirror(a: u12, m: u12) u12 { return min(a, m + m - a); }
+fn foldX(d: Dot, m: u12) Dot { return .{ .x = mirror(d.x, m), .y = d.y }; }
+fn foldY(d: Dot, m: u12) Dot { return .{ .x = d.x, .y = mirror(d.y, m) }; }
+
+pub fn main() !void {
+    var input = split(@embedFile("input"), "\n\n");
+    var dots = tokenize(input.next().?, "\n");
+    var folds = tokenize(input.next().?, "\n");
+    var code = @bitCast([6][40]u8, ([_]u8{ ' ' } ** 39 ++ [_]u8{ '\n' }) ** 6);
+    defer print("{s}", .{ @bitCast([240]u8, code) });
+
+    while (dots.next()) |line| : (folds.reset()) {
+        var coord = tokenize(line, ",");
+        var dot = Dot{ .x = try parseUnsigned(u12, coord.next().?, 10),
+                       .y = try parseUnsigned(u12, coord.next().?, 10) };
+        while (folds.next()) |instruction|
+            dot = switch (instruction[11]) {
+                'x' => foldX, 'y' => foldY,
+                else => unreachable,
+            } (dot, try parseUnsigned(u12, instruction[13..], 10));
+        code[dot.y][dot.x] = '|';
+    }
+}