const std = @import("std"); const fetch = @import("fetch"); const Str = []const u8; const opts = fetch.Options{ .year = 2024, .days = 1, }; const aoc2024 = struct { const day01 = @import("day01.zig"); }; test { _ = @import("day01.zig"); } pub fn main() anyerror!void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const allocator = gpa.allocator(); if (!fetch.checkInputs(opts.days)) { try fetch.fetchInputs(allocator, opts); } try solveAll(allocator); } fn solveAll(allocator: std.mem.Allocator) anyerror!void { var timer = try std.time.Timer.start(); var time_sum: usize = 0; var buffer = std.io.bufferedWriter(std.io.getStdOut().writer()); const stdout = buffer.writer(); try stdout.print("{s:<8}{s:>45}{s:>20}\n", .{ "Day", "Result", "Time" }); comptime var day: u5 = 0; inline while (day < opts.days) : (day += 1) { comptime var buf: [5]u8 = undefined; const day_str = comptime try std.fmt.bufPrint(&buf, "day{d:0>2}", .{day + 1}); timer.reset(); const first_res = @field(aoc2024, day_str).first(allocator) catch unreachable; const first_time = timer.read() / std.time.ns_per_us; time_sum += first_time; { const runtime_buffer = buf; // comptime -> runtime hack switch (@TypeOf(first_res)) { Str => try stdout.print("{s}a: {s:>45}{d:>20} us\n", .{ runtime_buffer, first_res, first_time }), usize, isize => try stdout.print("{s}a: {d:>45}{d:>20} us\n", .{ runtime_buffer, first_res, first_time }), else => try stdout.print("{s}a: {s:>45}{d:>20} us\n", .{ runtime_buffer, "", first_time }), } } if (day < 24) { timer.reset(); const second_res = @field(aoc2024, day_str).second(allocator) catch unreachable; const second_time = timer.read() / std.time.ns_per_us; time_sum += second_time; { const runtime_buffer = buf; // comptime -> runtime hack switch (@TypeOf(second_res)) { Str => try stdout.print("{s}b: {s:>45}{d:>20} us\n", .{ runtime_buffer, second_res, second_time }), usize, isize => try stdout.print("{s}b: {d:>45}{d:>20} us\n", .{ runtime_buffer, second_res, second_time }), else => try stdout.print("{s}b: {s:>45}{d:>20} us\n", .{ runtime_buffer, "", second_time }), } } } } try stdout.print("Total time: {d} ms\n", .{time_sum / std.time.us_per_ms}); try buffer.flush(); }