summaryrefslogtreecommitdiff
path: root/aoc24/tools
diff options
context:
space:
mode:
Diffstat (limited to 'aoc24/tools')
-rw-r--r--aoc24/tools/download_input.zig39
-rw-r--r--aoc24/tools/generate_main.zig37
2 files changed, 76 insertions, 0 deletions
diff --git a/aoc24/tools/download_input.zig b/aoc24/tools/download_input.zig
new file mode 100644
index 0000000..87c229a
--- /dev/null
+++ b/aoc24/tools/download_input.zig
@@ -0,0 +1,39 @@
+const std = @import("std");
+
+pub fn main() !void {
+ std.debug.print("Downloading input from adventofcode.com\n", .{});
+
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena.deinit();
+ const allocator = arena.allocator();
+
+ const args = try std.process.argsAlloc(allocator);
+
+ if (args.len != 3) return error.InvalidArguments;
+
+ const day = try std.fmt.parseInt(u32, args[1], 10);
+ const output_file_path = args[2];
+
+ var output_file = try std.fs.cwd().createFile(output_file_path, .{});
+ defer output_file.close();
+
+ const url = try std.fmt.allocPrint(allocator, "https://adventofcode.com/2024/day/{}/input", .{day});
+ defer allocator.free(url);
+ const session_cookie_header = try std.fmt.allocPrint(allocator, "session={s}", .{
+ std.posix.getenv("AOC_SESSION") orelse return error.MissingAocSession,
+ });
+ defer allocator.free(session_cookie_header);
+ var response = std.ArrayList(u8).init(allocator);
+ var client = std.http.Client{ .allocator = allocator };
+ const result = try client.fetch(.{
+ .location = .{ .url = url },
+ .response_storage = .{ .dynamic = &response },
+ .extra_headers = &[_]std.http.Header{
+ .{ .name = "Cookie", .value = session_cookie_header },
+ },
+ });
+ if (result.status != .ok) return error.InvalidStatusCode;
+
+ try output_file.writeAll(response.items);
+ return std.process.cleanExit();
+}
diff --git a/aoc24/tools/generate_main.zig b/aoc24/tools/generate_main.zig
new file mode 100644
index 0000000..e149127
--- /dev/null
+++ b/aoc24/tools/generate_main.zig
@@ -0,0 +1,37 @@
+const std = @import("std");
+
+pub fn main() !void {
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena.deinit();
+ const allocator = arena.allocator();
+
+ const args = try std.process.argsAlloc(allocator);
+
+ if (args.len != 3) return error.InvalidArguments;
+
+ const part = try std.fmt.parseInt(u32, args[1], 10);
+ const output_file_path = args[2];
+
+ var output_file = try std.fs.cwd().createFile(output_file_path, .{});
+ defer output_file.close();
+
+ try output_file.writer().print(
+ \\const std = @import("std");
+ \\const solution = @import("solution");
+ \\
+ \\pub fn main() !void {{
+ \\ const data = @embedFile("input");
+ \\
+ \\ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ \\ defer arena.deinit();
+ \\ const allocator = arena.allocator();
+ \\
+ \\ const input = try solution.parse(allocator, data);
+ \\ const output = try solution.part{}(allocator, input);
+ \\ try std.fmt.format(std.io.getStdOut().writer(), "{{}}\n", .{{output}});
+ \\}}
+ ,
+ .{part},
+ );
+ return std.process.cleanExit();
+}