advent-of-code/12021/09/09_2.awk

69 lines
1.4 KiB
Awk

BEGIN{
FS = ""
}
{
n = NF
for(i=1;i<=NF;i++){
h[NR,i] = $i
}
}
END {
bi = 1
for(y=1;y<=NR;y++){
for(x=1;x<=n;x++){
islowx = (h[y,x-1]>h[y,x]) && (h[y,x+1]>h[y,x]) || (x==1 && (h[y,x+1]>h[y,x])) || (x==n && h[y,x-1]>h[y,x])
islowy = (h[y-1,x]>h[y,x]) && (h[y+1,x]>h[y,x]) || (y==1 && h[y+1,x]>h[y,x]) || (y==NR && h[y-1,x]>h[y,x])
if(islowx && islowy ) {
lowy[bi] = y; lowx[bi++]=x
}
}
}
for( p in lowx ){
delete tocheck; delete visited
px = lowx[p]
py = lowy[p]
size[p] = 1
visited[py,px] = 1
tocheck[py,px] = 1
do{
delete ncheck
for(y=1;y<=NR;y++){
for(x=1;x<=n;x++){
if(tocheck[y,x]){
if(x>1 && h[y,x-1]<9 && !visited[y,x-1]){
ncheck[y,x-1]=1; visited[y,x-1] = 1
}
if(x<n && h[y,x+1]<9 && !visited[y,x+1]){
ncheck[y,x+1]=1; visited[y,x+1] = 1
}
if(y>1 && h[y-1,x]<9 && !visited[y-1,x]){
ncheck[y-1,x]=1; visited[y-1,x] = 1
}
if(y<NR && h[y+1,x]<9 && !visited[y+1,x]){
ncheck[y+1,x]=1; visited[y+1,x] = 1
}
tocheck[y,x] = 0
}
}
}
ntocheck = 0
for(y=1;y<=NR;y++){
for(x=1;x<=n;x++){
tocheck[y,x] = ncheck[y,x]
size[p] += tocheck[y,x]
ntocheck += tocheck[y,x]
# printf "%d ", ncheck[y,x]
}
# print ""
}
# print ntocheck
}while(ntocheck)
# print "---", size[p]
}
asort(size)
len = length(size)
print size[len]*size[len-1]*size[len-2]
}