diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2024-12-01 16:55:47 +0100 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2024-12-01 16:57:36 +0100 |
commit | ee7ee7ff1f136eceb739820d82f131ece3dd2cd2 (patch) | |
tree | f706d5721d8f886189dac6685d3a4412730b70b9 /aoc24/src/day1p1.zig | |
parent | f9b9de5f8a0d5b3069bb0b49a2100aa093bb2f4d (diff) | |
download | programming-problem-solving-ee7ee7ff1f136eceb739820d82f131ece3dd2cd2.tar.gz |
aoc2024: day 1
Diffstat (limited to 'aoc24/src/day1p1.zig')
-rw-r--r-- | aoc24/src/day1p1.zig | 49 |
1 files changed, 49 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; +} |