diff options
-rw-r--r-- | aoc/2021/10/Stack.zig | 35 | ||||
-rw-r--r-- | aoc/2021/10/part-one.zig | 10 | ||||
-rw-r--r-- | aoc/2021/10/part-two.zig | 46 | ||||
-rw-r--r-- | aoc/2021/10/stack.zig | 39 |
4 files changed, 56 insertions, 74 deletions
diff --git a/aoc/2021/10/Stack.zig b/aoc/2021/10/Stack.zig new file mode 100644 index 0000000..1aab8eb --- /dev/null +++ b/aoc/2021/10/Stack.zig @@ -0,0 +1,35 @@ +const Allocator = @import("std").mem.Allocator; +const Self = @This(); + +allocator: *Allocator, +memory: []u8, +len: usize, + +pub fn alloc(allocator: *Allocator, size: usize) !Self { + return Self{ + .allocator = allocator, + .memory = try allocator.alloc(u8, size), + .len = 0, + }; +} + +pub fn free(self: *Self) void { + self.allocator.free(self.memory); + self.* = undefined; +} + +pub fn push(self: *Self, node: u8) void { + self.memory[self.len] = node; + self.len += 1; +} + +pub fn pop(self: *Self) ?u8 { + if (self.len < 1) + return null; + self.len -= 1; + return self.memory[self.len]; +} + +pub fn reset(self: *Self) void { + self.len = 0; +} diff --git a/aoc/2021/10/part-one.zig b/aoc/2021/10/part-one.zig index 27ac20c..130fc4a 100644 --- a/aoc/2021/10/part-one.zig +++ b/aoc/2021/10/part-one.zig @@ -1,4 +1,4 @@ -const Stack = @import("stack.zig").Stack; +const Stack = @import("Stack.zig"); const page_allocator = std.heap.page_allocator; const print = std.debug.print; const std = @import("std"); @@ -11,17 +11,17 @@ pub fn main() !void { if (line.len > max_len) max_len = line.len; } - var stack = try Stack(u8).alloc(page_allocator, max_len); + var stack = try Stack.alloc(page_allocator, max_len); defer stack.free(); var sum: usize = 0; defer print("{}\n", .{ sum }); input.reset(); - while (input.next()) |line| { + while (input.next()) |line| : (stack.reset()) for (line) |c| switch (c) { '(', '[', '{', '<' => stack.push(c), - else => if (stack.pop() ^ c > 6) { + else => if (stack.pop().? ^ c > 6) { sum += @as(usize, switch (c) { ')' => 3, ']' => 57, '}' => 1197, '>' => 25137, else => unreachable, @@ -29,6 +29,4 @@ pub fn main() !void { break; }, }; - stack.reset(); - } } diff --git a/aoc/2021/10/part-two.zig b/aoc/2021/10/part-two.zig index 6e5b11d..4578272 100644 --- a/aoc/2021/10/part-two.zig +++ b/aoc/2021/10/part-two.zig @@ -1,5 +1,6 @@ -const Stack = @import("stack.zig").Stack; -const asc = std.sort.asc(usize); +const Stack = @import("Stack.zig"); +const desc = std.sort.desc(usize); +const indexOfScalar = std.mem.indexOfScalar; const page_allocator = std.heap.page_allocator; const print = std.debug.print; const sort = std.sort.sort; @@ -8,49 +9,36 @@ const tokenize = std.mem.tokenize; pub fn main() !void { var input = tokenize(@embedFile("input"), "\n"); - var incomplete: usize = 0; + var i: usize = 0; var max_len: usize = 0; - while (input.next()) |line| : (incomplete += 1) { + while (input.next()) |line| : (i += 1) { if (line.len > max_len) max_len = line.len; } - - var stack = try Stack(u8).alloc(page_allocator, max_len); + var stack = try Stack.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); + var scores = try page_allocator.alloc(usize, i); defer page_allocator.free(scores); input.reset(); - loop: while (input.next()) |line| { - stack.reset(); + loop: while (input.next()) |line| : (stack.reset()) { + i -= 1; + scores[i] = 0; for (line) |c| switch (c) { '(', '[', '{', '<' => stack.push(c), - else => if (stack.pop() ^ c > 6) continue :loop, + 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()) { + while (stack.pop()) |c| { + scores[i] *= 5; + scores[i] += @as(usize, switch (c) { '(' => 1, '[' => 2, '{' => 3, '<' => 4, else => unreachable, }); } } - sort(usize, scores, {}, asc); - print("{}\n", .{ scores[scores.len / 2] }); + sort(usize, scores, {}, desc); + i = indexOfScalar(usize, scores, 0).?; + print("{}\n", .{ scores[i / 2] }); } diff --git a/aoc/2021/10/stack.zig b/aoc/2021/10/stack.zig deleted file mode 100644 index 1002d61..0000000 --- a/aoc/2021/10/stack.zig +++ /dev/null @@ -1,39 +0,0 @@ -const Allocator = @import("std").mem.Allocator; - -pub fn Stack(comptime T: type) type { - return struct { - allocator: *Allocator, - memory: []T, - len: usize, - - const Self = @This(); - - pub fn alloc(allocator: *Allocator, size: usize) !Self { - return Self{ - .allocator = allocator, - .memory = try allocator.alloc(T, size), - .len = 0, - }; - } - - pub fn free(self: *Self) void { - self.allocator.free(self.memory); - self.* = undefined; - } - - pub fn push(self: *Self, node: T) void { - self.memory[self.len] = node; - self.len += 1; - } - - pub fn pop(self: *Self) T { - self.len -= 1; - return self.memory[self.len]; - } - - pub fn reset(self: *Self) void { - self.len = 0; - } - }; -} - |