summaryrefslogtreecommitdiff
path: root/aoc24/src/day1.zig
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2024-12-03 14:26:04 +0100
committerMathias Magnusson <mathias@magnusson.space>2024-12-03 14:36:12 +0100
commitbf494891a715080dde14753b51befb463a6c246f (patch)
treea1be0795f4d3b8db29f0f5569183989d3d23f6fc /aoc24/src/day1.zig
parent0c01b3924d55e0923cf895254b9412c9cedc9047 (diff)
downloadprogramming-problem-solving-bf494891a715080dde14753b51befb463a6c246f.tar.gz
aoc2024: make build tool download input & add shared main function
Diffstat (limited to 'aoc24/src/day1.zig')
-rw-r--r--aoc24/src/day1.zig70
1 files changed, 70 insertions, 0 deletions
diff --git a/aoc24/src/day1.zig b/aoc24/src/day1.zig
new file mode 100644
index 0000000..1f26943
--- /dev/null
+++ b/aoc24/src/day1.zig
@@ -0,0 +1,70 @@
+const std = @import("std");
+
+test {
+ std.debug.assert(try part1(
+ \\3 4
+ \\4 3
+ \\2 5
+ \\1 3
+ \\3 9
+ \\3 3
+ ) == 11);
+}
+
+const Input = struct {
+ lefts: std.ArrayList(u32),
+ rights: std.ArrayList(u32),
+};
+
+pub fn parse(allocator: std.mem.Allocator, input: []const u8) !Input {
+ var lines = std.mem.split(u8, input, "\n");
+
+ 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);
+ }
+
+ return .{ .lefts = lefts, .rights = rights };
+}
+
+pub fn part1(_: std.mem.Allocator, input: Input) !u32 {
+ std.mem.sort(u32, input.lefts.items, {}, std.sort.asc(u32));
+ std.mem.sort(u32, input.rights.items, {}, std.sort.asc(u32));
+
+ var sum: u32 = 0;
+ for (input.lefts.items, input.rights.items) |l, r| {
+ sum += @max(l, r) - @min(l, r);
+ }
+
+ return sum;
+}
+
+pub fn part2(allocator: std.mem.Allocator, input: Input) !u32 {
+ var right_counts = std.AutoHashMap(u32, u16).init(allocator);
+ defer right_counts.deinit();
+
+ for (input.rights.items) |right| {
+ const entry = try right_counts.getOrPut(right);
+ if (entry.found_existing)
+ entry.value_ptr.* += 1
+ else
+ entry.value_ptr.* = 1;
+ }
+
+ var sum: u32 = 0;
+ for (input.lefts.items) |x| {
+ const count: u32 = @intCast(right_counts.get(x) orelse 0);
+ sum += x * count;
+ }
+
+ return sum;
+}