summaryrefslogtreecommitdiff
path: root/aoc24/src
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2024-12-01 16:55:47 +0100
committerMathias Magnusson <mathias@magnusson.space>2024-12-01 16:57:36 +0100
commitee7ee7ff1f136eceb739820d82f131ece3dd2cd2 (patch)
treef706d5721d8f886189dac6685d3a4412730b70b9 /aoc24/src
parentf9b9de5f8a0d5b3069bb0b49a2100aa093bb2f4d (diff)
downloadprogramming-problem-solving-ee7ee7ff1f136eceb739820d82f131ece3dd2cd2.tar.gz
aoc2024: day 1
Diffstat (limited to 'aoc24/src')
-rw-r--r--aoc24/src/day1p1.zig49
-rw-r--r--aoc24/src/day1p2.zig51
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;
+}