advent-of-code/12021/11/11.awk

53 lines
1.2 KiB
Awk

BEGIN {
FS = ""
}
{
for(i=1;i<=NF;i++) o[NR,i] = $i
}
END{
flashes = 0
for(s=1;s<=100;s++){
delete flashed; delete visited
for(i in o) flashed[i] = 0
for(i in o){
o[i]++
if(!flashed[i] && o[i]>9) flashed[i] = 1
}
do{
for(y=1;y<=NR;y++){
for(x=1;x<=NF;x++){
if(!visited[y,x] && flashed[y,x]){
if(y>1 && x>1){ o[y-1,x-1]++; flashed[y-1,x-1]=o[y-1,x-1]>9; }
if(y>1 && x<NF){ o[y-1,x+1]++; flashed[y-1,x+1]=o[y-1,x+1]>9; }
if(y>1){ o[y-1,x]++; flashed[y-1,x]=o[y-1,x]>9;}
if(x>1){ o[y,x-1]++; flashed[y,x-1]=o[y,x-1]>9; }
if(x<NF){ o[y,x+1]++; flashed[y,x+1]=o[y,x+1]>9; }
if(y<NR && x>1){ o[y+1,x-1]++; flashed[y+1,x-1]=o[y+1,x-1]>9; }
if(y<NR && x<NF){ o[y+1,x+1]++; flashed[y+1,x+1]=o[y+1,x+1]>9; }
if(y<NR){ o[y+1,x]++; flashed[y+1,x]=o[y+1,x]>9; }
visited[y,x] = 1
}
}
}
tochange=0
for(i in flashed) tochange+=flashed[i]!=visited[i]
} while(tochange)
print "after step", s
for(y=1;y<=NR;y++){
for(x=1;x<=NF;x++){
# printf "%d:%d\t", o[y,x], flashed[y,x]
printf "%d",flashed[y,x]
}
print ""
}
for(i in flashed ){
flashes += flashed[i]>0
if( flashed[i] ) o[i] = 0
}
print "---", flashes
}
print ""
}