advent-of-code/20/20.awk

79 lines
1.1 KiB
Awk

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
}