-
Notifications
You must be signed in to change notification settings - Fork 0
/
seven.rb
78 lines (59 loc) · 1.63 KB
/
seven.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
class Seven < Day
class Folder
attr_reader :parent, :size, :sub_folders
def initialize(parent)
@parent = parent
@size = 0
@sub_folders = []
end
def navigate
folder = Folder.new(self)
@sub_folders.push folder
folder
end
def add_file(size)
@size += size
@parent.add_file(size) if @parent
end
end
def initialize
instructions = File.readlines('seven.txt', chomp: true)
current_folder = Folder.new(nil)
@root = current_folder
instructions.shift # cd / is meaningless
while instructions.size != 0
if instructions.first.start_with? '$ cd'
folder = instructions.first[5..]
if folder == '..'
current_folder = current_folder.parent
else
current_folder = current_folder.navigate
end
instructions.shift
elsif instructions.first.start_with? '$ ls'
instructions.shift
while instructions.first && !instructions.first.start_with?('$')
unless instructions.first.start_with? 'dir'
current_folder.add_file(instructions.first.split(' ').first.to_i)
end
instructions.shift
end
end
end
end
def part_a(folder = @root)
out = folder.sub_folders.sum(0) { part_a(_1) }
out += folder.size if folder.size < 100000
out
end
def part_b
sizes = directory_sizes
required_space = @root.size - 40000000
sizes.select { _1 > required_space }.sort.first
end
def directory_sizes(folder = @root)
out = folder.sub_folders.sum([]) { directory_sizes(_1) }
out.push folder.size
out
end
end