add solution for day 7

This commit is contained in:
Patrick Michl 2022-12-07 15:20:32 +01:00
parent 5697d36ff1
commit 8ee7085510
No known key found for this signature in database
GPG Key ID: BFE0ACEE21CD5EB0
2 changed files with 1112 additions and 0 deletions

1047
data/day_7.txt Normal file

File diff suppressed because it is too large Load Diff

65
src/day_7.jl Normal file
View File

@ -0,0 +1,65 @@
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
import .Aoc: @aoc
function size_of_dir(dirs::Dict{String, Int}, subdirs::Dict{String, Array{String}}, dir::String)
size = dirs[dir]
for sub in subdirs[dir]
sub in keys(dirs) && (size += size_of_dir(dirs, subdirs, sub))
end
size
end
function join_path(s1, s2)
s2 == ".." ? join(split(s1, '/')[begin:end-1], '/') : s1 * '/' * s2
end
function build_dirs(input::Vector{String})
dirs = Dict{String, Int}()
subdirs = Dict{String, Array{String}}()
pwd = ""
for i in input
if i[1] == '$'
cmd = split(i[3:end])
if cmd[1] == "cd"
pwd = cmd[2] == "/" ? "/" : join_path(pwd, cmd[2])
if pwd keys(dirs)
dirs[pwd] = 0
subdirs[pwd] = []
end
end
else
size, name = split(i)
if size == "dir"
push!(subdirs[pwd], join_path(pwd, name))
else
dirs[pwd] += parse(Int, size)
end
end
end
(dirs, subdirs)
end
function p1(input::Vector{String})
dirs, subdirs = build_dirs(input)
total = 0
for dir in keys(dirs)
size = size_of_dir(dirs, subdirs, dir)
size <= 100000 && (total+=size)
end
total
end
function p2(input::Vector{String})
dirs, subdirs = build_dirs(input)
free = 70000000 - size_of_dir(dirs, subdirs, "/")
res = 0
for dir in keys(dirs)
size = size_of_dir(dirs, subdirs, dir)
(free + size >= 30000000) && (res == 0 || res > size) && (res=size)
end
res
end
@aoc(2022, 7)