114 lines
3.1 KiB
Zig
114 lines
3.1 KiB
Zig
|
|
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;
|
||
|
|
}
|