Day4
This commit is contained in:
113
day4/zig/main.zig
Normal file
113
day4/zig/main.zig
Normal file
@@ -0,0 +1,113 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user