diff --git a/20/20.awk b/20/20.awk new file mode 100644 index 0000000..fa9ae36 --- /dev/null +++ b/20/20.awk @@ -0,0 +1,78 @@ +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 +} diff --git a/20/Makefile b/20/Makefile new file mode 100644 index 0000000..442c528 --- /dev/null +++ b/20/Makefile @@ -0,0 +1,14 @@ +1t: + awk -f 20.awk test + +1i: + awk -f 20.awk input + +2t: + awk -f 20_2.awk test + +2i: + awk -f 20_2.awk input + +paste: + xclip -sel c -o > test