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)!; };