diff options
| author | Polesznyák Márk <contact@pml68.dev> | 2025-12-04 16:36:34 +0100 |
|---|---|---|
| committer | Polesznyák Márk <contact@pml68.dev> | 2025-12-04 16:36:34 +0100 |
| commit | 7f3712b1a2f716a038105a5c6f29a093fc20d4df (patch) | |
| tree | a61bf5f72c79bc1ce92db9a76857ce39e0ab2f78 | |
| parent | feat: day4 part1 complete (diff) | |
| download | aoc-7f3712b1a2f716a038105a5c6f29a093fc20d4df.tar.gz | |
feat: day4 part2 complete
| -rw-r--r-- | day4/part2/main.ha | 70 |
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)!; +}; |
