@@ -14,17 +14,40 @@ def initialize(input=nil)
14
14
# day.part1 #=> 95_437
15
15
def part1
16
16
@dirs
17
- . map { |dir_name , _ |
18
- dirs
19
- . select { |subdir , _ | subdir . start_with? ( dir_name ) }
20
- . map { |dir , files | files . empty? ? 0 : files . map { |name , size | size } . reduce ( &:+ ) }
21
- . reduce ( &:+ )
22
- }
17
+ . map { |dir_name , _ | total_dir_size ( dir_name ) }
23
18
. select { |dir_size | dir_size < 100_000 }
24
19
. reduce ( &:+ )
25
20
end
26
21
22
+ # @example
23
+ # day.part2 #=> 24_933_642
27
24
def part2
25
+ disk_size = 70_000_000
26
+ current_free_space = disk_size - total_dir_size ( "root" )
27
+
28
+ space_needed_for_update = 30_000_000
29
+ delete_at_least_this_much = space_needed_for_update - current_free_space
30
+
31
+ @dirs
32
+ . map { |dir_name , _ | total_dir_size ( dir_name ) }
33
+ . select { |dir_size | dir_size > delete_at_least_this_much }
34
+ . sort
35
+ . first
36
+ end
37
+
38
+ # @example e
39
+ # day.total_dir_size('root/a/e') #=> 584
40
+ # @example a
41
+ # day.total_dir_size('root/a') #=> 94853
42
+ # @example d
43
+ # day.total_dir_size('root/d') #=> 24933642
44
+ # @example root
45
+ # day.total_dir_size('root') #=> 48381165
46
+ def total_dir_size ( dir_name )
47
+ @dirs
48
+ . select { |subdir , _ | subdir . start_with? ( dir_name ) }
49
+ . map { |dir , files | files . empty? ? 0 : files . map { |name , size | size } . reduce ( &:+ ) }
50
+ . reduce ( &:+ )
28
51
end
29
52
30
53
def parse_input
@@ -39,7 +62,6 @@ def parse_input
39
62
cwd = "root"
40
63
when "cd .."
41
64
cwd = cwd . split ( "/" ) [ 0 ..-2 ] . join ( "/" )
42
- cwd = "root" if cwd == ""
43
65
when /cd (\w *)/
44
66
cwd += "/#{ $1} "
45
67
when "ls"
0 commit comments