const std = @import("std"); const Tile = enum { empty, paper }; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); var stdin_buffer: [1024]u8 = undefined; var stdin_reader = std.fs.File.stdin().reader(&stdin_buffer); const stdin = &stdin_reader.interface; const allocator = gpa.allocator(); var rows = try std.ArrayList(std.ArrayList(Tile)).initCapacity(allocator, 1); defer rows.deinit(allocator); while (try stdin.takeDelimiter('\n')) |line| { var row = try std.ArrayList(Tile).initCapacity(allocator, 1); for (line) |c| { switch (c) { '.' => { try row.append(allocator, Tile.empty); }, '@' => { try row.append(allocator, Tile.paper); }, else => unreachable, } } try rows.append(allocator, row); } var task1: usize = 0; var i: isize = 0; while (i < rows.items.len) : (i += 1) { var j: isize = 0; while (j < rows.items[0].items.len) : (j += 1) { const i_u: usize = @intCast(i); const j_u: usize = @intCast(j); if (rows.items[i_u].items[j_u] != Tile.paper) { continue; } const paper_count = countNeighbors(j, i, rows); if (paper_count < 4) { task1 += 1; } } } var removed_count: usize = 1; var task2: usize = 0; while (removed_count > 0) { removed_count = 0; var ii: isize = 0; while (ii < rows.items.len) : (ii += 1) { var j: isize = 0; while (j < rows.items[0].items.len) : (j += 1) { const i_u: usize = @intCast(ii); const j_u: usize = @intCast(j); if (rows.items[i_u].items[j_u] != Tile.paper) { continue; } const paper_count = countNeighbors(j, ii, rows); if (paper_count < 4) { task2 += 1; rows.items[i_u].items[j_u] = Tile.empty; removed_count += 1; } } } } for (rows.items) |*row| { row.deinit(allocator); } std.debug.print("{d}\n", .{task1}); std.debug.print("{d}\n", .{task2}); } fn countNeighbors(x: isize, y: isize, rows: std.ArrayList(std.ArrayList(Tile))) usize { var paper_count: usize = 0; var i: isize = -1; while (i < 2) : (i += 1) { var j: isize = -1; while (j < 2) : (j += 1) { if (i == 0 and j == 0) { continue; } const x_new = x + i; const y_new = y + j; if (x_new < 0 or x_new >= rows.items[0].items.len or y_new < 0 or y_new >= rows.items.len) { continue; } const y_new_u: usize = @intCast(y_new); const z_new_u: usize = @intCast(x_new); if (rows.items[y_new_u].items[z_new_u] == Tile.paper) { paper_count += 1; } } } return paper_count; }