summary refs log tree commit diff stats
path: root/day22.jl
blob: 6e13236f1fa09d5b8c418228499a73453c899d28 (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
grid = Int.(hcat(collect.(readlines("day22.txt"))...).=='#')'
testgrid = [0 0 1; 1 0 0; 0 0 0]

rule1 = reshape([0 -1 1 0 0 1 -1 0], 2, 2, :)
rule2 = reshape([0 -1 1 0 1 0 0 1 0 1 -1 0 -1 0 0 -1], 2, 2, :)

function virus(grid, steps, dirs)
    (i, j), n = div.(size(grid).+1, 2), size(dirs, 3)
    di, dj, inf = -1, 0, 0
    g = Dict((i,j)=>grid[i,j]*div(n,2) for i=1:size(grid,1), j=1:size(grid,2))
    for _=1:steps
        x = get(g, (i,j), 0)
        g[i,j] = mod(x+1, n)
        (di, dj) = [di dj] * dirs[:,:,x+1]
        if x+1==n/2; inf+=1 end
        i+=di; j+=dj
    end
    inf
end

part1 = virus(grid, 10^4, rule1)
part2 = virus(grid, 10^7, rule2)

println(part1)
println(part2)