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 }