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 }