BEGIN{ RS = ""; FS="" } NR==1{ for(i=1;i<=NF;i++){ en[i-1] = $i=="#" ? 1 : 0 } RS = "\n" next } { for(i=-1;i<=NF+2;i++){ if(i>=1 && i<=NF) inp[i,NR-1] = $i=="#" ? 1 : 0 else inp[i,NR-1] = 0 } } function wintonum(px,py){ nbit = 8; num=0 for(j=py-1;j<=py+1;j++){ for(i=px-1;i<=px+1;i++){ b = inp[i,j]=="" ? 0 : inp[i,j] num += lshift( b, nbit) nbit-- } } return num } function wintonum2(px,py){ nbit = 8; num=0 for(j=py-1;j<=py+1;j++){ for(i=px-1;i<=px+1;i++){ b = inp[i,j]=="" ? en[0] : inp[i,j] num += lshift( b, nbit) nbit-- } } return num } END{ xmin=-1; xmax=NF+2 ymin=-1; ymax=NR+1 count = 0 # first pass for(y=ymin; y<=ymax; y++){ for(x=xmin; x<=xmax; x++){ newinp[x,y] = en[ wintonum(x,y) ] count += en[ wintonum(x,y) ] # printf "%c", newinp[x,y]==1? "#" : "." } # print "" } print count print "" delete inp # copy result for(p in newinp) inp[p] = newinp[p] # second pass count = 0 for(y=ymin; y<=ymax; y++){ for(x=xmin; x<=xmax; x++){ wn = wintonum2(x,y) count += en[ wn ] # printf "%c", en[ wn ]==1 ? "#" : "." } # print "" } print count }