summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoramelia squires <[email protected]>2025-12-08 12:38:50 -0600
committeramelia squires <[email protected]>2025-12-08 12:38:50 -0600
commit7ecb12636f40d143a87db5966f53e5adecd57319 (patch)
treebfb06f58733508a35050d1108547567b03722bf5
parent213fd52a5650a591e57e3f24c7039de58dc3a7d0 (diff)
day 8 (part 2)
-rw-r--r--src/day-8/part-2.zig72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/day-8/part-2.zig b/src/day-8/part-2.zig
new file mode 100644
index 0000000..9f7a22b
--- /dev/null
+++ b/src/day-8/part-2.zig
@@ -0,0 +1,72 @@
+const std = @import("std");
+
+const point = struct { x: i64, y: i64, z: i64 };
+const dist = struct { dist: f64, a: usize, b: usize };
+
+pub fn distance(a: point, b: point) f64 {
+ const x = std.math.pow(i64, a.x - b.x, 2);
+ const y = std.math.pow(i64, a.y - b.y, 2);
+ const z = std.math.pow(i64, a.z - b.z, 2);
+
+ return @abs(@sqrt(@as(f64, @floatFromInt(x + y + z))));
+}
+
+pub fn asc_dist(_: void, a: dist, b:dist) bool {
+ return a.dist < b.dist;
+}
+
+pub fn main() !void {
+ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
+ defer _ = gpa.deinit();
+ const alloc = gpa.allocator();
+
+ const path = "input.txt";
+ const fp = try std.fs.cwd().openFile(path, .{.mode = std.fs.File.OpenMode.read_only});
+ defer fp.close();
+ var reader = fp.reader();
+
+ var buffer: [256]u8 = undefined;
+
+ var points = std.ArrayList(point).init(alloc);
+ defer points.deinit();
+
+ while(try reader.readUntilDelimiterOrEof(&buffer, '\n')) |line| {
+ const v1 = std.mem.indexOf(u8, line, ",").?;
+ const v2 = std.mem.indexOf(u8, line[v1+1..], ",").? + v1+1;
+
+ const p = point{
+ .x = try std.fmt.parseInt(i64, line[0..v1], 10),
+ .y = try std.fmt.parseInt(i64, line[v1+1..v2], 10),
+ .z = try std.fmt.parseInt(i64, line[v2+1..], 10),
+ };
+
+ try points.append(p);
+ }
+
+ var dists = std.ArrayList(dist).init(alloc);
+ defer dists.deinit();
+ var used = std.AutoHashMap(usize, bool).init(alloc);
+ defer used.deinit();
+
+ for(0..points.items.len) |a| {
+ for(a..points.items.len) |b| {
+ if(a == b) continue;
+ const d = distance(points.items[a], points.items[b]);
+
+ try dists.append(dist{.dist = d, .a = a, .b = b});
+ }
+ }
+
+ std.mem.sort(dist, dists.items, {}, asc_dist);
+ for(dists.items) |o| {
+ try used.put(o.a, true);
+ try used.put(o.b, true);
+
+ if(used.count() >= points.items.len) {
+ std.debug.print("{}\n", .{points.items[o.a].x * points.items[o.b].x});
+ break;
+ }
+
+ }
+
+}