From 22cfef91fd8c3c6deee374a2c3dbad63eb8d6ce1 Mon Sep 17 00:00:00 2001 From: Benno Lorenz Date: Wed, 3 Dec 2025 15:47:37 +0100 Subject: [PATCH 1/2] day 2 --- src/days/day2.zig | 74 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.zig | 7 +++++ 2 files changed, 81 insertions(+) create mode 100644 src/days/day2.zig diff --git a/src/days/day2.zig b/src/days/day2.zig new file mode 100644 index 0000000..b1c4711 --- /dev/null +++ b/src/days/day2.zig @@ -0,0 +1,74 @@ +const std = @import("std"); + +pub fn day2pt1(ranges: []const u8) !usize { + var i = std.mem.splitScalar(u8, ranges, ','); + var sum: usize = 0; + while (i.next()) |range| { + var j = std.mem.splitScalar(u8, range, '-'); + const range_start = try std.fmt.parseInt(usize, j.next().?, 10); + const range_end = try std.fmt.parseInt(usize, j.next().?, 10); + + var k = range_start; + const max_len = 32; + var buf: [max_len]u8 = undefined; + while (k <= range_end) { + const current_id = try std.fmt.bufPrint(&buf, "{d}", .{k}); + if (current_id.len % 2 == 0) { + const half = current_id.len / 2; + if (std.mem.eql(u8, current_id[0..half], current_id[half..current_id.len])) { + sum += k; + } + } + k += 1; + } + } + return sum; +} + +pub fn day2pt2(ranges: []const u8) !usize { + var i = std.mem.splitScalar(u8, ranges, ','); + var sum: usize = 0; + while (i.next()) |range| { + var j = std.mem.splitScalar(u8, range, '-'); + const range_start = try std.fmt.parseInt(usize, j.next().?, 10); + const range_end = try std.fmt.parseInt(usize, j.next().?, 10); + + var k = range_start; + const max_len = 32; + var buf: [max_len]u8 = undefined; + while (k <= range_end) { + const current_id = try std.fmt.bufPrint(&buf, "{d}", .{k}); + const len = current_id.len; + var found = false; + // Try all possible substring lengths that divide the length - should be made more efficient (>人<;) + for (1..len / 2 + 1) |sub_len| { + if (len % sub_len != 0) continue; + const repeats = len / sub_len; + if (repeats < 2) continue; + const sub = current_id[0..sub_len]; + var valid = true; + for (1..repeats) |r| { + if (!std.mem.eql(u8, sub, current_id[r * sub_len .. (r + 1) * sub_len])) { + valid = false; + break; + } + } + if (valid) { + found = true; + break; + } + } + if (found) { + sum += k; + } + k += 1; + } + } + return sum; +} + +test "Day 2 example testing" { + const example_input = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; + try std.testing.expectEqual(try day2pt1(example_input), 1227775554); + try std.testing.expectEqual(try day2pt2(example_input), 4174379265); +} diff --git a/src/main.zig b/src/main.zig index 594ce17..76411ed 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,6 +1,7 @@ const std = @import("std"); const loadpuzzle = @import("utils/loadpuzzle.zig"); const day1 = @import("days/day1.zig"); +const day2 = @import("days/day2.zig"); pub fn main() !void { // Prints to stderr, ignoring potential errors. @@ -12,6 +13,12 @@ pub fn main() !void { const day1_input = try loadpuzzle.readFile(gpa, "puzzle_input/day1.txt"); std.debug.print("Day 1 Part 1: {any}\n", .{try day1.day1pt1(day1_input)}); std.debug.print("Day 1 Part 2: {any}\n", .{try day1.day1pt2(day1_input)}); + gpa.free(day1_input); + + const day2_input = try loadpuzzle.readFile(gpa, "puzzle_input/day2.txt"); + std.debug.print("Day 2 Part 1: {any}\n", .{try day2.day2pt1(day2_input)}); + std.debug.print("Day 2 Part 1: {any}\n", .{try day2.day2pt2(day2_input)}); + gpa.free(day2_input); } test "simple test" { From 519948d83fd2427dbc88340df203316c3f989087 Mon Sep 17 00:00:00 2001 From: Benno Lorenz Date: Wed, 3 Dec 2025 15:47:53 +0100 Subject: [PATCH 2/2] day 2 input --- puzzle_input/day2.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 puzzle_input/day2.txt diff --git a/puzzle_input/day2.txt b/puzzle_input/day2.txt new file mode 100644 index 0000000..5531ea6 --- /dev/null +++ b/puzzle_input/day2.txt @@ -0,0 +1 @@ +16100064-16192119,2117697596-2117933551,1-21,9999936269-10000072423,1770-2452,389429-427594,46633-66991,877764826-877930156,880869-991984,18943-26512,7216-9427,825-1162,581490-647864,2736-3909,39327886-39455605,430759-454012,1178-1741,219779-244138,77641-97923,1975994465-1976192503,3486612-3602532,277-378,418-690,74704280-74781349,3915-5717,665312-740273,69386294-69487574,2176846-2268755,26-45,372340114-372408052,7996502103-7996658803,7762107-7787125,48-64,4432420-4462711,130854-178173,87-115,244511-360206,69-86 \ No newline at end of file