diff options
author | Martin Ashby <martin@ashbysoft.com> | 2023-12-02 14:02:11 +0000 |
---|---|---|
committer | Martin Ashby <martin@ashbysoft.com> | 2023-12-02 14:02:11 +0000 |
commit | 9a5201154c28923c402d93e3ddee4858c10d8017 (patch) | |
tree | 1be2126e22afa231ebb06307a672128c1c70b294 | |
parent | b580fd512a7659585a8a749d97cf4763b8343ccf (diff) | |
download | aoc2023-9a5201154c28923c402d93e3ddee4858c10d8017.tar.gz aoc2023-9a5201154c28923c402d93e3ddee4858c10d8017.tar.bz2 aoc2023-9a5201154c28923c402d93e3ddee4858c10d8017.tar.xz aoc2023-9a5201154c28923c402d93e3ddee4858c10d8017.zip |
Pull out some common parts for day2
-rw-r--r-- | common.zig | 46 | ||||
-rw-r--r-- | day1.zig | 47 | ||||
-rw-r--r-- | day2.zig | 8 | ||||
-rw-r--r-- | day2_sample.in | 0 |
4 files changed, 59 insertions, 42 deletions
diff --git a/common.zig b/common.zig new file mode 100644 index 0000000..f724940 --- /dev/null +++ b/common.zig @@ -0,0 +1,46 @@ +const std = @import("std"); + +pub const Setup = struct { + pub const Part = enum { pt1, pt2 }; + + gpa: std.heap.GeneralPurposeAllocator(.{}), + a: std.mem.Allocator, + input: []const u8, + part: Part, + + pub fn get() !Setup { + var res: Setup = undefined; + res.gpa = std.heap.GeneralPurposeAllocator(.{}){}; + res.a = res.gpa.allocator(); + var p = std.process.args(); + var file: []const u8 = ""; + if (!p.skip()) return error.NoProgramName; + if (p.next()) |pp| { + if (std.mem.eql(u8, pp, "pt1")) { + res.part = .pt1; + } else if (std.mem.eql(u8, pp, "pt2")) { + res.part = .pt2; + } else { + return error.BadPartSpecified; + } + } else { + return error.NoPartSpecified; + } + if (p.next()) |pp| { + file = pp; + } else { + return error.NoPartSpecified; + } + + var f = try std.fs.cwd().openFile(file, .{}); + defer f.close(); + var c = try f.readToEndAlloc(res.a, std.math.maxInt(u32)); + res.input = c; + return res; + } + pub fn deinit(self: *Setup) void { + _ = self; + //self.a.free(self.input); // For some reason this is freezing + //_ = self.gpa.deinit(); // and if we don't free, then gpa.deinit whinges that we leaked memory :) + } +}; @@ -1,5 +1,6 @@ const std = @import("std"); const digits = "0123456789"; +const Setup = @import("common.zig").Setup; const words = [_][]const u8{ "0", @@ -47,51 +48,13 @@ const w2d = std.comptime_string_map.ComptimeStringMap(u8, .{ .{ "nine", 9 }, }); -const Input = struct { - const Part = enum { pt1, pt2 }; - file: []const u8, - part: Part, -}; - -pub fn getInput() !Input { - var p = std.process.args(); - var in: Input = .{ - .file = "", - .part = .pt1, - }; - if (!p.skip()) return error.NoProgramName; - if (p.next()) |pp| { - if (std.mem.eql(u8, pp, "pt1")) { - in.part = .pt1; - } else if (std.mem.eql(u8, pp, "pt2")) { - in.part = .pt2; - } else { - return error.BadPartSpecified; - } - } else { - return error.NoPartSpecified; - } - if (p.next()) |pp| { - in.file = pp; - } else { - return error.NoPartSpecified; - } - return in; -} - pub fn main() !void { - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - defer _ = gpa.deinit(); - const a = gpa.allocator(); - const in = try getInput(); - var f = try std.fs.cwd().openFile(in.file, .{}); - defer f.close(); - var c = try f.readToEndAlloc(a, std.math.maxInt(u32)); - defer a.free(c); - var l = std.mem.splitScalar(u8, c, '\n'); + var s = try Setup.get(); + defer s.deinit(); + var l = std.mem.splitScalar(u8, s.input, '\n'); var t: u64 = 0; while (l.next()) |n| { - switch (in.part) { + switch (s.part) { .pt1 => { const ix1 = std.mem.indexOfAny(u8, n, digits) orelse return error.NoDigits; const ix2 = std.mem.lastIndexOfAny(u8, n, digits) orelse return error.NoDigits; diff --git a/day2.zig b/day2.zig new file mode 100644 index 0000000..d4f8f85 --- /dev/null +++ b/day2.zig @@ -0,0 +1,8 @@ +const std = @import("std"); +const Setup = @import("common.zig").Setup; + +pub fn main() !void { + var setup = try Setup.get(); + defer setup.deinit(); + +}
\ No newline at end of file diff --git a/day2_sample.in b/day2_sample.in new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/day2_sample.in |