Advent of Code 2025 - Zig

Add new scaffolding

+7 -7
src/day1.zig
··· 1 1 const std = @import("std"); 2 + const Allocator = std.mem.Allocator; 2 3 3 - pub fn run(input: []u8) !void { 4 + pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } { 4 5 var lines = std.mem.tokenizeScalar(u8, input, '\n'); 5 6 6 7 var dial: u8 = 50; 7 - var zeroes_p1: u64 = 0; 8 - var zeroes_p2: u64 = 0; 8 + var answer1: u64 = 0; 9 + var answer2: u64 = 0; 9 10 while (lines.next()) |line| { 10 11 const direction: i2 = switch (line[0]) { 11 12 'L' => -1, ··· 24 25 dial = @intCast(@mod(new_rotation, 100)); 25 26 26 27 if (dial == 0) { 27 - zeroes_p1 += 1; 28 + answer1 += 1; 28 29 } 29 30 30 - zeroes_p2 += zeroes_clicked; 31 + answer2 += zeroes_clicked; 31 32 } 32 33 33 - std.debug.print("Answer P1: {d}\n", .{zeroes_p1}); 34 - std.debug.print("Answer P2: {d}\n", .{zeroes_p2}); 34 + return .{ answer1, answer2 }; 35 35 }
+3 -3
src/day2.zig
··· 1 1 const std = @import("std"); 2 + const Allocator = std.mem.Allocator; 2 3 3 - pub fn run(input: []u8) !void { 4 + pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } { 4 5 var ranges = std.mem.tokenizeScalar(u8, std.mem.trimEnd(u8, input, "\n"), ','); 5 6 6 7 var answer1: u64 = 0; ··· 48 49 } 49 50 } 50 51 51 - std.debug.print("Answer P1: {d}\n", .{answer1}); 52 - std.debug.print("Answer P2: {d}\n", .{answer2}); 52 + return .{ answer1, answer2 }; 53 53 }
+3 -3
src/day3.zig
··· 1 1 const std = @import("std"); 2 + const Allocator = std.mem.Allocator; 2 3 3 - pub fn run(input: []u8) !void { 4 + pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } { 4 5 var lines = std.mem.tokenizeScalar(u8, input, '\n'); 5 6 6 7 var answer1: u64 = 0; ··· 10 11 answer2 += try calculateJoltage(line, 12); 11 12 } 12 13 13 - std.debug.print("Answer P1: {d}\n", .{answer1}); 14 - std.debug.print("Answer P2: {d}\n", .{answer2}); 14 + return .{ answer1, answer2 }; 15 15 } 16 16 17 17 fn calculateJoltage(line: []const u8, num_digits: usize) !u64 {
+3 -3
src/day4.zig
··· 1 1 const std = @import("std"); 2 + const Allocator = std.mem.Allocator; 2 3 const StringTokenIterator = std.mem.TokenIterator(u8, .scalar); 3 4 4 5 const MAX_WIDTH = 137; ··· 32 33 return .{ .data = grid, .maxX = line_len, .maxY = i }; 33 34 } 34 35 35 - pub fn run(input: []u8) !void { 36 + pub fn run(_: Allocator, input: []u8) !struct { u64, u64 } { 36 37 var lines = std.mem.tokenizeScalar(u8, input, '\n'); 37 38 38 39 const grid = try newGrid(&lines); ··· 95 96 } 96 97 } 97 98 98 - std.debug.print("Answer P1: {d}\n", .{answer1}); 99 - std.debug.print("Answer P2: {d}\n", .{answer2}); 99 + return .{ answer1, answer2 }; 100 100 }
+2 -3
src/day5.zig
··· 11 11 } 12 12 }; 13 13 14 - pub fn run(allocator: Allocator, input: []u8) !void { 14 + pub fn run(allocator: Allocator, input: []u8) !struct { u64, u64 } { 15 15 var sections = std.mem.tokenizeSequence(u8, input, "\n\n"); 16 16 17 17 var answer1: u64 = 0; ··· 71 71 answer2 += item.high - item.low + 1; 72 72 } 73 73 74 - std.debug.print("Answer P1: {d}\n", .{answer1}); 75 - std.debug.print("Answer P2: {d}\n", .{answer2}); 74 + return .{ answer1, answer2 }; 76 75 }
+6
src/day6.zig
··· 1 + const std = @import("std"); 2 + const Allocator = std.mem.Allocator; 3 + 4 + pub fn run(allocator: Allocator, input: []u8) !void { 5 + return .{ 0, 0 }; 6 + }
+19 -14
src/main.zig
··· 1 1 const std = @import("std"); 2 - const day1 = @import("./day1.zig"); 3 - const day2 = @import("./day2.zig"); 4 - const day3 = @import("./day3.zig"); 5 - const day4 = @import("./day4.zig"); 6 - const day5 = @import("./day5.zig"); 2 + const days = .{ 3 + @import("./day1.zig"), 4 + @import("./day2.zig"), 5 + @import("./day3.zig"), 6 + @import("./day4.zig"), 7 + @import("./day5.zig"), 8 + }; 7 9 8 10 pub fn main() !void { 9 11 var args = std.process.args(); ··· 19 21 var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; 20 22 const allocator = gpa.allocator(); 21 23 22 - const day = try std.fmt.parseInt(u4, day_str, 10); 24 + const day_num = try std.fmt.parseInt(u4, day_str, 10); 23 25 24 - const input_path = try std.fmt.allocPrint(allocator, "inputs/day{d}{s}.txt", .{ day, test_str }); 26 + const input_path = try std.fmt.allocPrint(allocator, "inputs/day{d}{s}.txt", .{ day_num, test_str }); 25 27 defer allocator.free(input_path); 26 28 27 29 const input_file = try std.fs.cwd().openFile(input_path, .{}); ··· 33 35 const input_content = try reader.interface.allocRemaining(allocator, .unlimited); 34 36 defer allocator.free(input_content); 35 37 36 - switch (day) { 37 - 1 => try day1.run(input_content), 38 - 2 => try day2.run(input_content), 39 - 3 => try day3.run(input_content), 40 - 4 => try day4.run(input_content), 41 - 5 => try day5.run(allocator, input_content), 42 - else => {}, 38 + inline for (days, 1..) |day, i| { 39 + if (i == day_num) { 40 + std.debug.print("Day {d}\n\n", .{i}); 41 + 42 + const answer1, const answer2 = try day.run(allocator, input_content); 43 + 44 + std.debug.print("Answer P1: {d}\n", .{answer1}); 45 + std.debug.print("Answer P2: {d}\n", .{answer2}); 46 + break; 47 + } 43 48 } 44 49 }