diff --git a/data/day_11.txt b/data/day_11.txt new file mode 100644 index 0000000..95f25a9 --- /dev/null +++ b/data/day_11.txt @@ -0,0 +1,10 @@ +4781623888 +1784156114 +3265645122 +4371551414 +3377154886 +7882314455 +6421348681 +7175424287 +5488242184 +2448568261 diff --git a/src/day_11.jl b/src/day_11.jl new file mode 100644 index 0000000..f9fbffd --- /dev/null +++ b/src/day_11.jl @@ -0,0 +1,78 @@ +include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl")) +import .Aoc: @aoc +using Pipe: @pipe +using Combinatorics + + +function step(map, copy, x, y) + level = copy[x][y] = map[x][y] + 1 + if level == 10 + global flahes = flashes + 1 + for (x,y) in zip([-1,0,1,-1,1,-1,0,1], [1,1,1,0,0,-1,-1,-1]) + if x in 1:length(map) && y in 1:length(map[1]) + step(map, copy, x, y) + end + end + end +end + +function solve(input, part) + map = [ parse.(Int, collect(l)) for l in input ] + elements = length(map) * length(map[1]) + sum = 0 + step = 0 + + while true + step += 1 + flash = [] + flashed = [] + for x in 1:length(map) + for y in 1:length(map[1]) + map[x][y] += 1 + if map[x][y] > 9 + push!(flash, [x,y]) + push!(flashed, [x,y]) + end + end + end + while length(flash) != 0 + x, y = pop!(flash) + for (i,j) in zip([-1,0,1,-1,1,-1,0,1], [1,1,1,0,0,-1,-1,-1]) + nx = x + i + ny = y + j + if nx in 1:length(map) && ny in 1:length(map[1]) + map[nx][ny] += 1 + if map[nx][ny] > 9 && [nx, ny] ∉ flashed + push!(flash, [nx,ny]) + push!(flashed, [nx,ny]) + end + end + end + end + + for (x,y) in flashed + map[x][y] = 0 + end + + sum += length(flashed) + + if part == 1 && step == 100 + break + end + + if part == 2 && length(unique(flashed)) == elements + return step + end + end + return sum +end + +function p1(input::Vector{String}) + solve(input, 1) +end + +function p2(input::Vector{String}) + solve(input, 2) +end + +@aoc(2021, 11)