C
For loops!
Code
#include <stdio.h>
#define GZ 144
static char g[GZ][GZ];
int
main()
{
int p1=0,p2=0, nc=0, x,y;
for (y=1; fgets(g[y]+1, GZ-2, stdin); y++)
;
for (y=1; y<GZ-1; y++)
for (x=1; x<GZ-1; x++)
p1 += g[y][x] == '@' &&
(g[y-1][x-1] == '@') +
(g[y-1][x ] == '@') +
(g[y-1][x+1] == '@') +
(g[y ][x-1] == '@') +
(g[y ][x+1] == '@') +
(g[y+1][x-1] == '@') +
(g[y+1][x ] == '@') +
(g[y+1][x+1] == '@') < 4;
do {
nc = 0;
for (y=1; y<GZ-1; y++)
for (x=1; x<GZ-1; x++)
if (g[y][x] == '@' &&
(g[y-1][x-1] == '@') +
(g[y-1][x ] == '@') +
(g[y-1][x+1] == '@') +
(g[y ][x-1] == '@') +
(g[y ][x+1] == '@') +
(g[y+1][x-1] == '@') +
(g[y+1][x ] == '@') +
(g[y+1][x+1] == '@') < 4) {
nc++;
p2++;
g[y][x] = '.';
}
} while (nc);
printf("04: %d %d\n", p1, p2);
return 0;
}
For my x86-16 version, the 20K input is pushing it over the 64K .COM limit, so I'll need to implement some better compression first.