This repository has been archived on 2022-12-11. You can view files and clone it, but cannot push or open issues or pull requests.
aoc2022/08/1-2.zig

97 lines
2.7 KiB
Zig

const std = @import("std");
// This one isn't as commented. Sorry for that.
pub fn main() void {
const input = @embedFile("input");
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
const allocator = arena.allocator();
var iter = std.mem.split(u8, input[0 .. input.len - 1], "\n");
const grid = iterCollapse([]const u8, &iter, allocator) catch unreachable;
var nVisible: usize = 0;
var bestPoints: usize = 0;
// For each cell in the grid
for (grid) |row, y| {
for (row) |cell, x| {
var cellVisible: bool = false;
var cellPoints: usize = 1;
defer {
if (cellVisible) nVisible += 1;
if (cellPoints > bestPoints) bestPoints = cellPoints;
}
// Look from the left
var i: usize = x;
var dirPoints: usize = 0;
while (i > 0) : (i -= 1) {
dirPoints += 1;
if (grid[y][i - 1] >= cell) break;
} else {
cellVisible = true;
}
cellPoints *= dirPoints;
// Look from the right
i = x + 1;
dirPoints = 0;
while (i < grid[0].len) : (i += 1) {
dirPoints += 1;
if (grid[y][i] >= cell) break;
} else {
cellVisible = true;
}
cellPoints *= dirPoints;
// Look from the top
i = y;
dirPoints = 0;
while (i > 0) : (i -= 1) {
dirPoints += 1;
if (grid[i - 1][x] >= cell) break;
} else {
cellVisible = true;
}
cellPoints *= dirPoints;
// Look from the bottom
i = y + 1;
dirPoints = 0;
while (i < grid.len) : (i += 1) {
dirPoints += 1;
if (grid[i][x] >= cell) break;
} else {
cellVisible = true;
}
cellPoints *= dirPoints;
}
}
print("Part 1: {}\n", .{nVisible});
print("Part 2: {}\n", .{bestPoints});
}
// -------------------- UTIL --------------------
pub fn print(comptime fmt: []const u8, args: anytype) void {
std.io.getStdOut().writer().print(fmt, args) catch unreachable;
}
pub fn iterCollapse(comptime T: type, iter: anytype, allocator: std.mem.Allocator) ![]T {
var vector = std.ArrayList(T).init(allocator);
if (!@hasDecl(@TypeOf(iter.*), "next")) {
@compileError("Cannot collapse type " ++ @typeName(@TypeOf(iter.*)) ++ ". No .next() method.");
}
while (@field(iter.*, "next")()) |item| {
try vector.append(item);
}
return vector.items;
}