-
Notifications
You must be signed in to change notification settings - Fork 0
/
14.jl
49 lines (46 loc) · 1.14 KB
/
14.jl
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
open("14.txt") do f
l = readlines(f)
rows, cols = length(l), length(l[1])
S = falses(rows, cols)
B = falses(rows, cols)
for r∈1:rows, c∈1:cols
S[r,c] = l[r][c]=='#'
B[r,c] = l[r][c]=='O'
end
function north!(B)
done = false
while !done
done = true
for r∈2:rows, c∈1:cols
!B[r,c] && continue
(B[r-1,c] || S[r-1,c]) && continue
B[r,c] = false
B[r-1,c] = true
done = false
end
end
return B
end
north!(B)
p1 = sum([sum(B[r,:]) * (rows+1-r) for r∈1:rows])
println("Part 1: ", p1)
i = 0
seen::Array{BitMatrix} = []
while true
for _ ∈ 1:4
north!(B)
B = rotr90(B)
S = rotr90(S)
end
i += 1
B ∈ seen && break
push!(seen, deepcopy(B))
end
goal = 1000000000
start = findfirst(==(B), seen)
cycle = i-start
goaleq = (goal-start)%cycle + start
B = seen[goaleq]
p2 = sum([sum(B[r,:]) * (rows+1-r) for r∈1:rows])
println("Part 2: ", p2)
end