AdventOfCode-2022/day7.cr

65 lines
1.2 KiB
Crystal

require "advent"
INPUT = input(2022, 7).lines[1..]
class DirTree
property name : String
property files : Hash(String, Int64)
property subDirs : Array(DirTree)
property parent : DirTree?
def initialize(@name, @parent)
@files = {} of String => Int64
@subDirs= [] of DirTree
@parent.try &.subDirs.<<(self)
end
def sum_yielding(&block : Int32 ->): Int32
size = 0
size += @subDirs.sum do |x|
x.sum_yielding(&block)
end
size += @files.sum { |k,v| v }
yield size
return size
end
end
dir = DirTree.new("", nil)
INPUT.each do |line|
if line =~ /\$ cd (.+)$/
if $1 == ".."
dir = dir.parent.not_nil!
else
dir = DirTree.new($1, dir)
end
elsif line == "$ ls"
else
x, y = line.split(" ")
if x == "dir"
else
dir.files[y] = x.to_i64
end
end
end
while par = dir.parent
dir = par
end
total = 0
outer_size = dir.sum_yielding do |i|
total += i if i <= 100000
end
puts total
puts "Used: #{outer_size}"
puts "Unused: #{70000000 - outer_size}"
to_delete = 30000000 - (70000000 - outer_size)
puts "To delete: #{to_delete}"
big_enough = [] of Int32
outer_size = dir.sum_yielding do |i|
big_enough << i if i >= to_delete
end
puts big_enough.min