const std = @import("std");
const path = "data/day09/input.txt";
const RetType = u10;
const directions = [4][2]i2{
.{ 1, 0 },
.{ 0, 1 },
.{ -1, 0 },
.{ 0, -1 },
};
const grid_row = 100;
const grid_col = 100;
const GridType = u4;
const Grid = [grid_row][grid_col]GridType;
pub fn parseInput() anyerror!Grid {
const input = @embedFile(path);
var lines = std.mem.split(u8, input, "\n");
var g: Grid = undefined;
var row: usize = 0;
while (lines.next()) |line| : (row += 1) {
for (line) |_, col| {
g[row][col] = try std.fmt.parseUnsigned(GridType, line[col .. col + 1], 10);
}
}
return g;
}
pub fn first(allocator: ?std.mem.Allocator) anyerror!RetType {
_ = allocator;
const grid = try parseInput();
var ret: RetType = 0;
for (grid) |line, row| {
items: for (line) |item, col| {
for (directions) |dir| {
const diffrow = @intCast(i10, row) + dir[0];
const diffcol = @intCast(i10, col) + dir[1];
if ((diffrow < 0) or (diffrow >= grid_row)) continue;
if ((diffcol < 0) or (diffcol >= grid_col)) continue;
if (item >= grid[@intCast(usize, diffrow)][@intCast(usize, diffcol)]) {
continue :items;
}
}
ret += item + 1;
}
}
return ret;
}
pub fn main() anyerror!void {
var timer = try std.time.Timer.start();
const ret = try first(null);
const f = timer.lap() / 1000;
try std.testing.expectEqual(ret, @as(RetType, 550));
std.debug.print("Day 9a result: {d} \t\ttime: {d}us\n", .{ ret, f });
}
test "day09a" {
try std.testing.expectEqual(@as(RetType, 550), try first(std.testing.allocator));
}