import * as fs from "fs" const t0 = process.hrtime.bigint() const raw = fs.readFileSync("input.txt","utf8").split(/\r?\n/) const h = raw.length const rows: Uint8Array[] = new Array(h) const lens = new Int32Array(h) for (let i = 0; i < h; i++) { const s = raw[i] if (!s) { rows[i] = new Uint8Array(0) lens[i] = -1 } else { const a = new Uint8Array(s.length) for (let j = 0; j < s.length; j++) a[j] = s.charCodeAt(j) rows[i] = a lens[i] = s.length } } const adj = new Int8Array([ 0,-1, 0,1, -1,0, 1,0, -1,-1, -1,1, 1,-1, 1,1 ]) let maxw = 0 for (let i = 0; i < h; i++) if (lens[i] > maxw) maxw = lens[i] const neigh = Array.from({length:h},()=>new Int8Array(maxw)) for (let r = 0; r < h; r++) { const w = lens[r] if (w < 0) continue const row = rows[r] for (let c = 0; c < w; c++) { if (row[c] !== 64) continue for (let k = 0; k < 16; k += 2) { const rr = r + adj[k] if (rr < 0 || rr >= h) continue const w2 = lens[rr] if (w2 < 0) continue const cc = c + adj[k+1] if (cc < 0 || cc >= w2) continue neigh[rr][cc]++ } } } let removed = 0 const buf_r: number[] = [] const buf_c: number[] = [] while (true) { buf_r.length = 0 buf_c.length = 0 for (let r = 0; r < h; r++) { const w = lens[r] if (w < 0) continue const row = rows[r] const nr = neigh[r] for (let c = 0; c < w; c++) { if (row[c] === 64 && nr[c] < 4) { buf_r.push(r) buf_c.push(c) } } } const n = buf_r.length if (n === 0) break removed += n for (let i = 0; i < n; i++) { const r = buf_r[i] const c = buf_c[i] rows[r][c] = 46 for (let k = 0; k < 16; k += 2) { const rr = r + adj[k] if (rr < 0 || rr >= h) continue const w2 = lens[rr] if (w2 < 0) continue const cc = c + adj[k+1] if (cc < 0 || cc >= w2) continue neigh[rr][cc]-- } } } const t1 = process.hrtime.bigint() console.log(removed) console.log(`Time: ${Number(t1 - t0)/1e6} ms`)