Advent of Code 2025 - Zig

Add new scaffolding

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