aoc2025 @ 40a7ae0bde3e0d351f21733cc7fbf1c620470207

  1diff --git a/src/bench.zig b/src/bench.zig
  2index 0c09c8f541ad2bace508157d8f0064cee806960f..5dbcd9bef9582ca8d77eae91464b22d2385bf2fc 100644
  3--- a/src/bench.zig
  4+++ b/src/bench.zig
  5@@ -5,6 +5,7 @@ const day1 = @import("day1.zig");
  6 const day2 = @import("day2.zig");
  7 const day3 = @import("day3.zig");
  8 const day4 = @import("day4.zig");
  9+const day5 = @import("day5.zig");
 10 
 11 fn day1pt1(_: std.mem.Allocator) void {
 12     _ = day1.pt1(@embedFile("input/day1"));
 13@@ -38,6 +39,14 @@ fn day4pt2(_: std.mem.Allocator) void {
 14     _ = day4.pt2(@embedFile("input/day4"));
 15 }
 16 
 17+fn day5pt1(alloc: std.mem.Allocator) void {
 18+    _ = day5.pt1(alloc, @embedFile("input/day5")) catch unreachable;
 19+}
 20+
 21+fn day5pt2(alloc: std.mem.Allocator) void {
 22+    _ = day5.pt2(alloc, @embedFile("input/day5")) catch unreachable;
 23+}
 24+
 25 pub fn main() !void {
 26     var stdout = std.fs.File.stdout().writerStreaming(&.{});
 27     const writer = &stdout.interface;
 28@@ -53,6 +62,8 @@     try bench.add("Dia 3 parte 1", day3pt1, .{});
 29     try bench.add("Dia 3 parte 2", day3pt2, .{});
 30     try bench.add("Dia 4 parte 1", day4pt1, .{});
 31     try bench.add("Dia 4 parte 2", day4pt2, .{});
 32+    try bench.add("Dia 5 parte 1", day5pt1, .{ .track_allocations = true });
 33+    try bench.add("Dia 5 parte 2", day5pt2, .{ .track_allocations = true });
 34 
 35     try writer.writeAll("\n");
 36     try bench.run(writer);
 37diff --git a/src/day1.zig b/src/day1.zig
 38index 85771788737b1855af9510f05bd678a3e1bc0948..af4771b69cffb975d3f81f2725ec7b652e1a665d 100644
 39--- a/src/day1.zig
 40+++ b/src/day1.zig
 41@@ -29,7 +29,6 @@
 42     return counter;
 43 }
 44 
 45-
 46 const operator = enum { left, right };
 47 pub fn pt2(input: []const u8) u64 {
 48     var pointer: i64 = 50;
 49@@ -81,7 +80,6 @@ test "Day 1 part 1" {
 50     const res = pt1(@embedFile("./input/day1"));
 51     try std.testing.expect(res == 1165);
 52 }
 53-
 54 
 55 test "Day 1 part 2" {
 56     const res = pt2(@embedFile("./input/day1"));
 57diff --git a/src/day5.zig b/src/day5.zig
 58new file mode 100644
 59index 0000000000000000000000000000000000000000..841707e9ea64b10dd0c34147a85ea35eae0c1c3b
 60--- /dev/null
 61+++ b/src/day5.zig
 62@@ -0,0 +1,104 @@
 63+const std = @import("std");
 64+const Allocator = std.mem.Allocator;
 65+
 66+pub fn pt1(alloc: Allocator, input: []const u8) !u64 {
 67+    var counter: u64 = 0;
 68+
 69+    var lines = std.mem.splitScalar(u8, input, '\n');
 70+    var ranges = std.ArrayList(Range).empty;
 71+    defer ranges.deinit(alloc);
 72+
 73+    while (lines.next()) |l| {
 74+        if (l.len == 0) {
 75+            break;
 76+        }
 77+
 78+        var range_iter = std.mem.splitScalar(u8, l, '-');
 79+        const range: Range = .{
 80+            .from = std.fmt.parseInt(u64, range_iter.next().?, 10) catch unreachable,
 81+            .to = std.fmt.parseInt(u64, range_iter.next().?, 10) catch unreachable,
 82+        };
 83+        try ranges.append(alloc, range);
 84+    }
 85+
 86+    while (lines.next()) |l| {
 87+        if (l.len == 0) {
 88+            return counter;
 89+        }
 90+
 91+        const id = std.fmt.parseInt(u64, l, 10) catch unreachable;
 92+        for (ranges.items) |r| {
 93+            if (r.from <= id and id <= r.to) {
 94+                counter += 1;
 95+                break;
 96+            }
 97+        }
 98+    }
 99+
100+    return counter;
101+}
102+
103+pub fn pt2(alloc: Allocator, input: []const u8) !u64 {
104+    var lines = std.mem.splitScalar(u8, input, '\n');
105+    var ranges = std.ArrayList(Range).empty;
106+    defer ranges.deinit(alloc);
107+
108+    while (lines.next()) |l| {
109+        if (l.len == 0) {
110+            break;
111+        }
112+
113+        var range_iter = std.mem.splitScalar(u8, l, '-');
114+        const range: Range = .{
115+            .from = std.fmt.parseInt(u64, range_iter.next().?, 10) catch unreachable,
116+            .to = std.fmt.parseInt(u64, range_iter.next().?, 10) catch unreachable,
117+        };
118+        try ranges.append(alloc, range);
119+    }
120+
121+    std.mem.sort(Range, ranges.items, {}, struct {
122+        fn lessThan(_: void, a: Range, b: Range) bool {
123+            return a.from < b.from;
124+        }
125+    }.lessThan);
126+
127+    var merged = std.ArrayList(Range).empty;
128+    defer merged.deinit(alloc);
129+
130+    var current = ranges.items[0];
131+
132+    for (ranges.items[1..]) |range| {
133+        if (current.to + 1 >= range.from) {
134+            if (range.to > current.to) {
135+                current.to = range.to;
136+            }
137+        } else {
138+            try merged.append(alloc, current);
139+            current = range;
140+        }
141+    }
142+
143+    try merged.append(alloc, current);
144+
145+    var total: u64 = 0;
146+    for (merged.items) |range| {
147+        total += (range.to - range.from) + 1;
148+    }
149+
150+    return total;
151+}
152+
153+const Range = struct {
154+    from: u64,
155+    to: u64,
156+};
157+
158+test "Day 5 part 1" {
159+    const res = pt1(std.testing.allocator, @embedFile("./input/day5"));
160+    try std.testing.expect(res == 652);
161+}
162+
163+test "Day 5 part 2" {
164+    const res = pt2(std.testing.allocator, @embedFile("./input/day5"));
165+    try std.testing.expect(res == 341753674214273);
166+}
167diff --git a/src/input/day5 b/src/input/day5
168new file mode 100644
169index 0000000000000000000000000000000000000000..aac99a99cc189b46b9af621a08218c5bc2d051fd
170Binary files /dev/null and b/src/input/day5 differ
171diff --git a/src/main.zig b/src/main.zig
172index 6455f59e76e1b787966c4f3dc6ec34b0870af721..911929f200374eb17e0ec8f9461609c4465d5d7f 100644
173--- a/src/main.zig
174+++ b/src/main.zig
175@@ -3,8 +3,13 @@ const day1 = @import("day1.zig");
176 const day2 = @import("day2.zig");
177 const day3 = @import("day3.zig");
178 const day4 = @import("day4.zig");
179+const day5 = @import("day5.zig");
180 
181-pub export fn main() void {
182+pub fn main() !void {
183+    var gpa = std.heap.GeneralPurposeAllocator(.{ .thread_safe = false }){};
184+    const alloc = gpa.allocator();
185+    defer _ = gpa.detectLeaks();
186+
187     for (1..std.os.argv.len) |i| {
188         const day = std.mem.span(std.os.argv[i]);
189 
190@@ -24,6 +29,10 @@         } else if (std.mem.eql(u8, "day4", day)) {
191             const input = @embedFile("./input/day4");
192             print(day4.pt1(input));
193             print(day4.pt2(input));
194+        } else if (std.mem.eql(u8, "day5", day)) {
195+            const input = @embedFile("./input/day5");
196+            print(try day5.pt1(alloc, input));
197+            print(try day5.pt2(alloc, input));
198         }
199     }
200 }