const std = @import("std"); const len = 150; pub fn main() !void { const path: [:0]const u8 = std.mem.span(std.os.argv[1]); var file = try std.fs.cwd().openFile(path, .{}); defer file.close(); var buffer: [1024]u8 = undefined; var reader = file.reader(&buffer); var part1: u64 = 0; var part2: u64 = 0; var row = [_]usize{0} ** len; while (reader.interface.peekDelimiterExclusive('\n')) |line| { reader.interface.toss(line.len + 1); std.debug.assert(line.len < len); var next = [_]usize{0} ** len; for (line, 0..) |c, i| { if (c == 'S') { @branchHint(.unlikely); next[i] = 1; } else if (c == '^') { if (row[i] != 0) { part1 += 1; } if (i > 0) { next[i - 1] += row[i]; } if (i + 1 < line.len) { next[i + 1] += row[i]; } } else { @branchHint(.likely); next[i] += row[i]; } } row = next; } else |err| switch (err) { error.EndOfStream => {}, else => |e| return e, } for (row) |n| { part2 += n; } std.debug.print("part1: {}\n", .{part1}); std.debug.print("part2: {}\n", .{part2}); }