aoc2025 @ 9296278e038ee98c69478902eb8ad2c19cc78086

  1diff --git a/src/day4.zig b/src/day4.zig
  2new file mode 100644
  3index 0000000000000000000000000000000000000000..878fa9180df8d93b0fcf6d2198b0b732d2017b04
  4--- /dev/null
  5+++ b/src/day4.zig
  6@@ -0,0 +1,86 @@
  7+const std = @import("std");
  8+
  9+pub fn pt1(input: []const u8) u64 {
 10+    var counter: u64 = 0;
 11+
 12+    var lines = std.mem.splitScalar(u8, input, '\n');
 13+
 14+    var loop_count: usize = 0;
 15+    while (lines.next()) |l| {
 16+        if (l.len == 0) break;
 17+        for (0..l.len) |y| {
 18+            board[loop_count][y] = l[y] == '@';
 19+        }
 20+        loop_count += 1;
 21+    }
 22+
 23+    for (0..board.len) |x| {
 24+        for (0..board[x].len) |y| {
 25+            if (board[x][y] and countSurround(x, y) < 4) {
 26+                counter += 1;
 27+            }
 28+        }
 29+    }
 30+
 31+    return counter;
 32+}
 33+
 34+pub fn pt2(input: []const u8) u64 {
 35+    var counter: u64 = 0;
 36+
 37+    var lines = std.mem.splitScalar(u8, input, '\n');
 38+
 39+    var loop_count: usize = 0;
 40+    while (lines.next()) |l| {
 41+        if (l.len == 0) break;
 42+        for (0..l.len) |y| {
 43+            board[loop_count][y] = l[y] == '@';
 44+        }
 45+        loop_count += 1;
 46+    }
 47+
 48+    var hit = true;
 49+    while (hit) {
 50+        hit = false;
 51+        for (0..board.len) |x| {
 52+            for (0..board[x].len) |y| {
 53+                if (board[x][y] and countSurround(x, y) < 4) {
 54+                    counter += 1;
 55+                    board[x][y] = false;
 56+                    hit = true;
 57+                }
 58+            }
 59+        }
 60+    }
 61+
 62+    return counter;
 63+}
 64+
 65+var board: [138][138]bool = undefined;
 66+fn countSurround(rx: usize, ry: usize) i64 {
 67+    var count: i64 = 0;
 68+
 69+    const min_x = if (rx > 0) rx - 1 else 0;
 70+    const max_x = if (rx + 1 < board.len) rx + 1 else board.len - 1;
 71+    const min_y = if (ry > 0) ry - 1 else 0;
 72+    const max_y = if (ry + 1 < board.len) ry + 1 else board.len - 1;
 73+
 74+    for (min_x..max_x + 1) |x| {
 75+        for (min_y..max_y + 1) |y| {
 76+            if (x == rx and y == ry) continue; // Skip the center cell
 77+            if (board[x][y]) count += 1;
 78+        }
 79+    }
 80+
 81+    return count;
 82+}
 83+
 84+test "Day 4 par 1" {
 85+    const res = pt1(@embedFile("./input/day4"));
 86+    try std.testing.expect(res == 1549);
 87+}
 88+
 89+test "Day 4 par 2" {
 90+    const res = pt2(@embedFile("./input/day4"));
 91+    try std.testing.expect(res == 8887);
 92+}
 93diff --git a/src/input/day4 b/src/input/day4
 94new file mode 100644
 95index 0000000000000000000000000000000000000000..077dbbc3692bea9874c6efe168d843a119543f08
 96Binary files /dev/null and b/src/input/day4 differ
 97diff --git a/src/main.zig b/src/main.zig
 98index 93f82e0a5b5b0ae9e893ad93f303fc42e4b68ca7..6455f59e76e1b787966c4f3dc6ec34b0870af721 100644
 99--- a/src/main.zig
100+++ b/src/main.zig
101@@ -2,6 +2,7 @@ const std = @import("std");
102 const day1 = @import("day1.zig");
103 const day2 = @import("day2.zig");
104 const day3 = @import("day3.zig");
105+const day4 = @import("day4.zig");
106 
107 pub export fn main() void {
108     for (1..std.os.argv.len) |i| {
109@@ -19,6 +20,10 @@         } else if (std.mem.eql(u8, "day3", day)) {
110             const input = @embedFile("./input/day3");
111             print(day3.pt1(input));
112             print(day3.pt2(input));
113+        } else if (std.mem.eql(u8, "day4", day)) {
114+            const input = @embedFile("./input/day4");
115+            print(day4.pt1(input));
116+            print(day4.pt2(input));
117         }
118     }
119 }