parent
7100955ccb
commit
2b722205d2
@ -0,0 +1,105 @@
|
|||||||
|
#!/usr/bin/env julia
|
||||||
|
|
||||||
|
using Test
|
||||||
|
|
||||||
|
mutable struct Dir
|
||||||
|
path :: String
|
||||||
|
dnames :: Vector{String}
|
||||||
|
fsize :: Int32
|
||||||
|
end
|
||||||
|
|
||||||
|
function get_dir_map(infile)
|
||||||
|
cwd = Vector{String}()
|
||||||
|
path = "/"
|
||||||
|
dirmap = Dict{String, Dir}()
|
||||||
|
open(infile, "r") do io
|
||||||
|
for line in eachline(io)
|
||||||
|
parts = split(line)
|
||||||
|
if parts[1] == "\$"
|
||||||
|
if parts[2] == "cd"
|
||||||
|
if parts[3] == "/"
|
||||||
|
empty!(cwd)
|
||||||
|
elseif parts[3] == ".."
|
||||||
|
pop!(cwd)
|
||||||
|
else
|
||||||
|
push!(cwd, parts[3])
|
||||||
|
end
|
||||||
|
path = "/" * join(cwd, '/')
|
||||||
|
if ! haskey(dirmap, path)
|
||||||
|
dirmap[path] = Dir(path, [], 0)
|
||||||
|
end
|
||||||
|
elseif parts[2] != "ls"
|
||||||
|
println("Unknown command: ", line)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
parts = split(line, limit=2)
|
||||||
|
if parts[1] == "dir"
|
||||||
|
push!(dirmap[path].dnames, joinpath(path, parts[2]))
|
||||||
|
else
|
||||||
|
dirmap[path].fsize += parse(Int, parts[1])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k in sort(collect(keys(dirmap)), by=p->length(p), rev=true)
|
||||||
|
v = dirmap[k]
|
||||||
|
for p in v.dnames
|
||||||
|
dirmap[k].fsize += dirmap[p].fsize
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return dirmap
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function small_dir_sum(infile)
|
||||||
|
dirmap = get_dir_map(infile)
|
||||||
|
small_sum = 0
|
||||||
|
for v in values(dirmap)
|
||||||
|
if v.fsize <= 100000
|
||||||
|
small_sum += v.fsize
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return small_sum
|
||||||
|
end
|
||||||
|
|
||||||
|
function delete_candidate_size(infile)
|
||||||
|
dirmap = get_dir_map(infile)
|
||||||
|
total = 70000000
|
||||||
|
want = 30000000
|
||||||
|
used = dirmap["/"].fsize
|
||||||
|
free = total - used
|
||||||
|
need = want - free
|
||||||
|
candidates = Vector{Int64}()
|
||||||
|
# println("used ", used)
|
||||||
|
# println("free ", free)
|
||||||
|
# println("need ", need)
|
||||||
|
for v in values(dirmap)
|
||||||
|
if v.fsize >= need
|
||||||
|
push!(candidates, v.fsize)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return minimum(candidates)
|
||||||
|
end
|
||||||
|
|
||||||
|
function test()
|
||||||
|
@testset "disk usage small dir sum" verbose=true begin
|
||||||
|
@test small_dir_sum("example.txt") == 95437
|
||||||
|
@test small_dir_sum("input.txt") == 1306611
|
||||||
|
end
|
||||||
|
@testset "disk usage delete candidate size" verbose=true begin
|
||||||
|
@test delete_candidate_size("example.txt") == 24933642
|
||||||
|
@test delete_candidate_size("input.txt") == 13210366
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function main()
|
||||||
|
if size(ARGS, 1) == 0
|
||||||
|
test()
|
||||||
|
else
|
||||||
|
infile = ARGS[1]
|
||||||
|
println("infile = ", infile)
|
||||||
|
println("error priority sum: ", rucksack_errors(infile))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
main()
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
$ cd /
|
||||||
|
$ ls
|
||||||
|
dir a
|
||||||
|
14848514 b.txt
|
||||||
|
8504156 c.dat
|
||||||
|
dir d
|
||||||
|
$ cd a
|
||||||
|
$ ls
|
||||||
|
dir e
|
||||||
|
29116 f
|
||||||
|
2557 g
|
||||||
|
62596 h.lst
|
||||||
|
$ cd e
|
||||||
|
$ ls
|
||||||
|
584 i
|
||||||
|
$ cd ..
|
||||||
|
$ cd ..
|
||||||
|
$ cd d
|
||||||
|
$ ls
|
||||||
|
4060174 j
|
||||||
|
8033020 d.log
|
||||||
|
5626152 d.ext
|
||||||
|
7214296 k
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue