summaryrefslogtreecommitdiff
path: root/day4/part2.TXT
blob: 33779c53f4d776749bc0021b0314859d30a21c8a (plain) (blame)
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\