diff options
Diffstat (limited to 'aoc24/src')
-rw-r--r-- | aoc24/src/day1p1.zig | 49 | ||||
-rw-r--r-- | aoc24/src/day1p2.zig | 51 |
2 files changed, 100 insertions, 0 deletions
diff --git a/aoc24/src/day1p1.zig b/aoc24/src/day1p1.zig new file mode 100644 index 0000000..fba4b8c --- /dev/null +++ b/aoc24/src/day1p1.zig @@ -0,0 +1,49 @@ +const std = @import("std"); + +pub fn main() !void { + const input = @embedFile("1.txt"); + try std.fmt.format(std.io.getStdOut().writer(), "{}\n", .{try run(input)}); +} + +test { + std.debug.assert(try run( + \\3 4 + \\4 3 + \\2 5 + \\1 3 + \\3 9 + \\3 3 + ) == 11); +} + +pub fn run(input: []const u8) !u32 { + var lines = std.mem.split(u8, input, "\n"); + + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + + var lefts = std.ArrayList(u32).init(allocator); + defer lefts.deinit(); + var rights = std.ArrayList(u32).init(allocator); + defer rights.deinit(); + + while (lines.next()) |line| { + if (line.len == 0) continue; + var words = std.mem.split(u8, line, " "); + const left = try std.fmt.parseInt(u32, words.next() orelse return error.InvalidInput, 10); + const right = try std.fmt.parseInt(u32, words.next() orelse return error.InvalidInput, 10); + try lefts.append(left); + try rights.append(right); + } + + std.mem.sort(u32, lefts.items, {}, std.sort.asc(u32)); + std.mem.sort(u32, rights.items, {}, std.sort.asc(u32)); + + var sum: u32 = 0; + for (lefts.items, rights.items) |l, r| { + sum += @max(l, r) - @min(l, r); + } + + return sum; +} diff --git a/aoc24/src/day1p2.zig b/aoc24/src/day1p2.zig new file mode 100644 index 0000000..91b99fa --- /dev/null +++ b/aoc24/src/day1p2.zig @@ -0,0 +1,51 @@ +const std = @import("std"); + +pub fn main() !void { + const input = @embedFile("1.txt"); + try std.fmt.format(std.io.getStdOut().writer(), "{}\n", .{try run(input)}); +} + +test { + std.debug.assert(try run( + \\3 4 + \\4 3 + \\2 5 + \\1 3 + \\3 9 + \\3 3 + ) == 31); +} + +pub fn run(input: []const u8) !u32 { + var lines = std.mem.split(u8, input, "\n"); + + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + + var lefts = std.ArrayList(u32).init(allocator); + defer lefts.deinit(); + var rights = std.AutoHashMap(u32, u16).init(allocator); + defer rights.deinit(); + + while (lines.next()) |line| { + if (line.len == 0) continue; + var words = std.mem.split(u8, line, " "); + const left = try std.fmt.parseInt(u32, words.next() orelse return error.InvalidInput, 10); + const right = try std.fmt.parseInt(u32, words.next() orelse return error.InvalidInput, 10); + try lefts.append(left); + const entry = try rights.getOrPut(right); + if (entry.found_existing) + entry.value_ptr.* += 1 + else + entry.value_ptr.* = 1; + } + + var sum: u32 = 0; + for (lefts.items) |x| { + const count: u32 = @intCast(rights.get(x) orelse 0); + sum += x * count; + } + + return sum; +} |