Advent of Code 2025 - Zig
1const std = @import("std"); 2 3pub fn run(input: []u8) !void { 4 var ranges = std.mem.tokenizeScalar(u8, std.mem.trimEnd(u8, input, "\n"), ','); 5 6 var answer1: u64 = 0; 7 var answer2: u64 = 0; 8 while (ranges.next()) |range_str| { 9 var range = std.mem.tokenizeScalar(u8, range_str, '-'); 10 11 const low = try std.fmt.parseInt(u64, range.next().?, 10); 12 const high = try std.fmt.parseInt(u64, range.next().?, 10); 13 14 var buf: [32]u8 = undefined; 15 for (low..high + 1) |num| { 16 const num_str = try std.fmt.bufPrint(&buf, "{d}", .{num}); 17 18 const middle = num_str.len / 2; 19 20 if (std.mem.eql(u8, num_str[0..middle], num_str[middle..])) { 21 answer1 += num; 22 answer2 += num; 23 continue; 24 } 25 26 for (1..middle + 1) |chunk_len| { 27 const repeating_str = num_str[0..chunk_len]; 28 29 var is_repeating = true; 30 var i = chunk_len; 31 while (i + chunk_len <= num_str.len) : (i += chunk_len) { 32 if (num_str.len % chunk_len != 0) { 33 is_repeating = false; 34 break; 35 } 36 37 if (!std.mem.eql(u8, repeating_str, num_str[i .. i + chunk_len])) { 38 is_repeating = false; 39 break; 40 } 41 } 42 43 if (is_repeating) { 44 answer2 += num; 45 break; 46 } 47 } 48 } 49 } 50 51 std.debug.print("Answer P1: {d}\n", .{answer1}); 52 std.debug.print("Answer P2: {d}\n", .{answer2}); 53}