summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPolesznyák Márk <contact@pml68.dev>2025-12-04 16:36:34 +0100
committerPolesznyák Márk <contact@pml68.dev>2025-12-04 16:36:34 +0100
commit7f3712b1a2f716a038105a5c6f29a093fc20d4df (patch)
treea61bf5f72c79bc1ce92db9a76857ce39e0ab2f78
parentfeat: day4 part1 complete (diff)
downloadaoc-7f3712b1a2f716a038105a5c6f29a093fc20d4df.tar.gz
feat: day4 part2 complete
-rw-r--r--day4/part2/main.ha70
1 files changed, 70 insertions, 0 deletions
diff --git a/day4/part2/main.ha b/day4/part2/main.ha
new file mode 100644
index 0000000..5e1d10a
--- /dev/null
+++ b/day4/part2/main.ha
@@ -0,0 +1,70 @@
+use fmt;
+use io;
+use os;
+use strconv;
+use strings::{fromutf8_unsafe, split, torunes};
+
+const adjacent_positions: [8][2]int = [
+ [-1, -1],
+ [ 0, -1],
+ [ 1, -1],
+ [-1, 0],
+ [ 1, 0],
+ [-1, 1],
+ [ 0, 1],
+ [ 1, 1]
+];
+
+fn adjacent_rolls(grid: [][]rune, x: int, y: int) u64 = {
+ let rolls: u64 = 0;
+
+ for (let pos .. adjacent_positions) {
+ let col = x: int + pos[0];
+ let row = y: int + pos[1];
+
+ if (col < 0 || col >= len(grid[0]): int ||
+ row < 0 || row >= len(grid): int)
+ continue;
+
+
+ if (grid[row][col] == '@')
+ rolls += 1;
+ };
+
+ return rolls;
+};
+
+export fn main() void = {
+ let handle = os::open("input.txt")!;
+ defer io::close(handle)!;
+
+ let buf = io::drain(handle)!;
+ defer free(buf);
+
+ let lines = split(fromutf8_unsafe(buf), "\n")!;
+ let grid: [][]rune = [];
+
+ let total_removable_rolls: u64 = 0;
+ let removed_rolls: u64 = 666;
+
+ for (let line .. lines) {
+ if (line != "")
+ append(grid, torunes(line)!)!;
+ };
+
+ for (removed_rolls > 0) {
+ removed_rolls = 0;
+ for (let x: size = 0; x < len(grid[0]); x += 1) {
+ for (let y: size = 0; y < len(grid); y += 1) {
+ if (grid[y][x] == '@' &&
+ adjacent_rolls(grid, x: int, y: int) < 4) {
+ grid[y][x] = '.';
+ total_removable_rolls += 1;
+ removed_rolls += 1;
+ };
+ };
+ };
+ };
+
+ fmt::printfln("Answer: {}", total_removable_rolls)!;
+};