From 7f3712b1a2f716a038105a5c6f29a093fc20d4df Mon Sep 17 00:00:00 2001 From: Polesznyák Márk Date: Thu, 4 Dec 2025 16:36:34 +0100 Subject: feat: day4 part2 complete --- day4/part2/main.ha | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 day4/part2/main.ha (limited to 'day4/part2') 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)!; +}; -- cgit v1.2.3