1diff --git a/build.zig b/build.zig 2index a2c95a1b24be84341ee23c8894c471f414898382..81cd3afc991dfa73518b812c85fd668b3b02860d 100644 3--- a/build.zig 4+++ b/build.zig 5@@ -9,7 +9,6 @@ .name = "aoc2024", 6 .root_module = b.createModule(.{ 7 .root_source_file = b.path("src/main.zig"), 8 .target = target, 9- .link_libc = false, 10 .optimize = optimize, 11 .single_threaded = true, 12 }), 13diff --git a/src/day3.zig b/src/day3.zig 14new file mode 100644 15index 0000000000000000000000000000000000000000..611da9e689a588d3c19cd0e6f057f897e4f78066 16--- /dev/null 17+++ b/src/day3.zig 18@@ -0,0 +1,75 @@ 19+const std = @import("std"); 20+ 21+pub fn pt1(input: []const u8) u64 { 22+ var counter: u64 = 0; 23+ 24+ var lines = std.mem.splitScalar(u8, input, '\n'); 25+ 26+ while (lines.next()) |l| { 27+ if (l.len == 0) return counter; 28+ 29+ var buff_line: [100]u8 = undefined; 30+ parseLine(&buff_line, l); 31+ counter += calcJolts(2, &buff_line); 32+ } 33+ 34+ return counter; 35+} 36+ 37+pub fn pt2(input: []const u8) u64 { 38+ var counter: u64 = 0; 39+ 40+ var lines = std.mem.splitScalar(u8, input, '\n'); 41+ 42+ while (lines.next()) |l| { 43+ if (l.len == 0) return counter; 44+ 45+ var buff_line: [100]u8 = undefined; 46+ parseLine(&buff_line, l); 47+ counter += calcJolts(12, &buff_line); 48+ } 49+ 50+ return counter; 51+} 52+ 53+fn parseLine(buff_line: []u8, line: []const u8) void { 54+ for (0..line.len, line) |i, l| { 55+ const d = l - '0'; 56+ buff_line[i] = d; 57+ } 58+} 59+ 60+fn calcJolts(n: usize, js: []const u8) u64 { 61+ var counter: u64 = 0; 62+ var index: usize = 0; 63+ for (0..n) |p| { 64+ var inner_index = index; 65+ 66+ // plus one to fix disparity between index (starts at 0) and size 67+ const upper_bound = js.len - (n - p) + 1; 68+ for (index..upper_bound) |i| { 69+ if (js[inner_index] < js[i]) inner_index = i; 70+ } 71+ 72+ // the amounts of zeros is inverse to the position of p in relation to 73+ // size. At p=0 we have the maximum numbers of zero n. At p=n-1, which 74+ // p reached its maximum value, pow(10,0) which is 1 (thanks math for 75+ // helping with the edge case). 76+ const res = js[inner_index] * std.math.pow(u64, 10, n - p - 1); 77+ 78+ counter += res; 79+ index = inner_index + 1; // don't forget to advance index. 80+ } 81+ 82+ return counter; 83+} 84+ 85+test "Day 3 par 1" { 86+ const res = pt1(@embedFile("./input/day3")); 87+ try std.testing.expect(res == 17311); 88+} 89+ 90+test "Day 3 par 2" { 91+ const res = pt2(@embedFile("./input/day3")); 92+ try std.testing.expect(res == 171419245422055); 93+} 94diff --git a/src/input/day3 b/src/input/day3 95new file mode 100644 96index 0000000000000000000000000000000000000000..98c171568b84dc3e4111e407cc1c8d45c940bc27 97Binary files /dev/null and b/src/input/day3 differ 98diff --git a/src/main.zig b/src/main.zig 99index a4db764ce025c1f5602895b2bd39383d4d53333f..93f82e0a5b5b0ae9e893ad93f303fc42e4b68ca7 100644 100--- a/src/main.zig 101+++ b/src/main.zig 102@@ -1,17 +1,24 @@ 103 const std = @import("std"); 104 const day1 = @import("day1.zig"); 105 const day2 = @import("day2.zig"); 106+const day3 = @import("day3.zig"); 107 108 pub export fn main() void { 109 for (1..std.os.argv.len) |i| { 110 const day = std.mem.span(std.os.argv[i]); 111 112 if (std.mem.eql(u8, "day1", day)) { 113- print(day1.pt1(@embedFile("./input/day1"))); 114- print(day1.pt2(@embedFile("./input/day1"))); 115+ const input = @embedFile("./input/day1"); 116+ print(day1.pt1(input)); 117+ print(day1.pt2(input)); 118 } else if (std.mem.eql(u8, "day2", day)) { 119- print(day2.pt1(@embedFile("./input/day2"))); 120- print(day2.pt2(@embedFile("./input/day2"))); 121+ const input = @embedFile("./input/day2"); 122+ print(day2.pt1(input)); 123+ print(day2.pt2(input)); 124+ } else if (std.mem.eql(u8, "day3", day)) { 125+ const input = @embedFile("./input/day3"); 126+ print(day3.pt1(input)); 127+ print(day3.pt2(input)); 128 } 129 } 130 }