Files

114 lines
3.1 KiB
Zig
Raw Permalink Normal View History

2025-12-04 19:10:35 +01:00
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;
}