diff options
Diffstat (limited to 'aoc/2021/10/part-two.zig')
-rw-r--r-- | aoc/2021/10/part-two.zig | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/aoc/2021/10/part-two.zig b/aoc/2021/10/part-two.zig new file mode 100644 index 0000000..6e5b11d --- /dev/null +++ b/aoc/2021/10/part-two.zig @@ -0,0 +1,56 @@ +const Stack = @import("stack.zig").Stack; +const asc = std.sort.asc(usize); +const page_allocator = std.heap.page_allocator; +const print = std.debug.print; +const sort = std.sort.sort; +const std = @import("std"); +const tokenize = std.mem.tokenize; + +pub fn main() !void { + var input = tokenize(@embedFile("input"), "\n"); + var incomplete: usize = 0; + var max_len: usize = 0; + while (input.next()) |line| : (incomplete += 1) { + if (line.len > max_len) + max_len = line.len; + } + + var stack = try Stack(u8).alloc(page_allocator, max_len); + defer stack.free(); + input.reset(); + while (input.next()) |line| { + for (line) |c| + switch (c) { + '(', '[', '{', '<' => stack.push(c), + else => if (stack.pop() ^ c > 6) { + incomplete -= 1; + break; + }, + }; + stack.reset(); + } + + var scores = try page_allocator.alloc(usize, incomplete); + defer page_allocator.free(scores); + input.reset(); + loop: while (input.next()) |line| { + stack.reset(); + for (line) |c| + switch (c) { + '(', '[', '{', '<' => stack.push(c), + else => if (stack.pop() ^ c > 6) continue :loop, + }; + incomplete -= 1; + scores[incomplete] = 0; + while (stack.len > 0) { + scores[incomplete] *= 5; + scores[incomplete] += @as(usize, switch (stack.pop()) { + '(' => 1, '[' => 2, '{' => 3, '<' => 4, + else => unreachable, + }); + } + } + + sort(usize, scores, {}, asc); + print("{}\n", .{ scores[scores.len / 2] }); +} |