1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
\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<h Then
cnt3bits(getbits(s[j+1],i-1,3))\->\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\
|