diff options
| author | amelia squires <[email protected]> | 2025-12-08 12:38:50 -0600 |
|---|---|---|
| committer | amelia squires <[email protected]> | 2025-12-08 12:38:50 -0600 |
| commit | 7ecb12636f40d143a87db5966f53e5adecd57319 (patch) | |
| tree | bfb06f58733508a35050d1108547567b03722bf5 | |
| parent | 213fd52a5650a591e57e3f24c7039de58dc3a7d0 (diff) | |
day 8 (part 2)
| -rw-r--r-- | src/day-8/part-2.zig | 72 |
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; + } + + } + +} |
