\START92\ \COMMENT=Part2 Day4 s: parsed input, w: input width \NAME=part2 \FILE=day4.part2.92f (s,w) Func Local h,i,j,k,l,curr,prevs,pc,result,stack,stnum newMat(2,2500)\->\stack 0\->\stnum 0\->\result dim(s)\->\h If h<1 Then Return result ElseIf h=1 Then cntbits(s[1])\->\result[dim(result)] Return result EndIf For i,1,w newList(3)\->\prevs false\->\pc For j,1,h getbits(s[j],i-1,3)\->\curr cnt3bits(curr)\->\prevs[mod(j,3)+1] \(C)\'and' is not short circuiting If pc Then If sum(prevs)<5 Then result+1\->\result zerobit(s[j-1],i)\->\s[j-1] stnum+1\->\stnum j-1\->\stack[1,stnum] i\->\stack[2,stnum] EndIf EndIf curr=2 or curr=3 or curr=6 or curr=7\->\pc EndFor \(C)\ last line If pc Then 0\->\prevs[mod(h+1,3)+1] If sum(prevs)<5 Then result+1\->\result zerobit(s[h],i)\->\s[h] stnum+1\->\stnum h\->\stack[1,stnum] i\->\stack[2,stnum] EndIf EndIf EndFor While stnum>0 stack[1,stnum]\->\l stack[2,stnum]\->\k stnum-1\->\stnum For j,max(1,l-1),min(h,l+1) For i,max(1,k-1),min(w,k+1) If i\!=\k or j\!=\l Then getbits(s[j],i-1,3)\->\curr If curr=2 or curr=3 or curr\>=\6 Then cnt3bits(curr)\->\prevs[1] If j>1 Then cnt3bits(getbits(s[j-1],i-1,3))\->\prevs[2] Else 0\->\prevs[2] EndIf If j\prevs[3] Else 0\->\prevs[3] EndIf If sum(prevs)<5 Then result+1\->\result zerobit(s[j],i)\->\s[j] stnum+1\->\stnum j\->\stack[1,stnum] i\->\stack[2,stnum] EndIf EndIf EndIf EndFor EndFor EndWhile result EndFunc \STOP92\