mirror of
https://github.com/thegeneralist01/aoc
synced 2026-03-07 10:59:54 +01:00
120 lines
3.1 KiB
Zig
120 lines
3.1 KiB
Zig
const std = @import("std");
|
|
const in = @embedFile("test");
|
|
|
|
const Point = struct {
|
|
value: u8,
|
|
overlaps: bool,
|
|
x: i32,
|
|
y: i32,
|
|
};
|
|
|
|
fn get_point(grid: *std.ArrayList(std.ArrayList(Point)), x: i32, y: i32) error{NotFound}!Point {
|
|
for (grid.items) |line| {
|
|
for (line.items) |point| {
|
|
if (point.x == x and point.y == y) {
|
|
return point;
|
|
}
|
|
}
|
|
}
|
|
return error.NotFound;
|
|
}
|
|
|
|
pub fn main() !void {
|
|
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
const ally = gpa.allocator();
|
|
defer _ = gpa.deinit();
|
|
|
|
var grid = std.ArrayList(std.ArrayList(Point)).init(ally);
|
|
defer {
|
|
for (grid.items) |l| {
|
|
l.deinit();
|
|
}
|
|
grid.deinit();
|
|
}
|
|
|
|
var points = std.AutoArrayHashMap(u8, std.ArrayList(*Point)).init(ally);
|
|
defer {
|
|
var iter = points.iterator();
|
|
while (iter.next()) |p| {
|
|
p.value_ptr.deinit();
|
|
}
|
|
points.deinit();
|
|
}
|
|
|
|
var in_lines = std.mem.tokenize(u8, in, "\n");
|
|
var y: i32 = 0;
|
|
var x: i32 = 0;
|
|
while (in_lines.next()) |l| {
|
|
x = @intCast(l.len);
|
|
var line = std.ArrayList(Point).init(ally);
|
|
|
|
for (l, 0..) |c, _x| {
|
|
if (c == '.') {
|
|
try line.append(Point{
|
|
.value = c,
|
|
.overlaps = false,
|
|
.x = @intCast(_x),
|
|
.y = y,
|
|
});
|
|
} else {
|
|
var point = Point{
|
|
.value = c,
|
|
.overlaps = false,
|
|
.x = @intCast(_x),
|
|
.y = y,
|
|
};
|
|
try line.append(point);
|
|
|
|
var entry = try points.getOrPut(c);
|
|
if (!entry.found_existing) {
|
|
entry.value_ptr.* = std.ArrayList(*Point).init(ally);
|
|
}
|
|
try entry.value_ptr.append(&point);
|
|
}
|
|
}
|
|
|
|
try grid.append(line);
|
|
y += 1;
|
|
}
|
|
|
|
var points_iter = points.iterator();
|
|
while (points_iter.next()) |p| {
|
|
const items = p.value_ptr.*;
|
|
for (items.items) |p1| {
|
|
for (items.items) |p2| {
|
|
if (p1 == p2) continue;
|
|
|
|
const dx = p2.x - p1.x;
|
|
const dy = p2.y - p1.y;
|
|
|
|
const x3 = p2.x + dx;
|
|
const y3 = p2.y + dy;
|
|
|
|
if (y3 < 0 or y3 >= y or x3 < 0 or x3 >= x) continue;
|
|
|
|
var point = get_point(&grid, x3, y3) catch continue;
|
|
if (point.value == '.') {
|
|
point.value = '#';
|
|
} else {
|
|
point.overlaps = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// TODO: overlapping
|
|
var amount: u32 = 0;
|
|
for (grid.items) |row| {
|
|
for (row.items) |p| {
|
|
if (p.value == '#' or p.overlaps == true) {
|
|
amount += 1;
|
|
}
|
|
// std.debug.print("{s}", .{[_]u8{p.value}});
|
|
std.debug.print("{d}", .{@intFromBool(p.overlaps)});
|
|
}
|
|
std.debug.print(" -- amount: {d}\n", .{amount});
|
|
}
|
|
|
|
std.debug.print("{d}\n", .{2});
|
|
}
|