-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday20_part2.rb
45 lines (36 loc) · 988 Bytes
/
day20_part2.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
def process(lines)
ranges = []
lines.each do |l|
start, finish = l.split("-").map{|n|n.to_i}
ranges << [start, finish]
end
ranges.sort_by!{|r|r[0]}
full_ranges = [[0,0]]
ranges.each do |r|
new_ranges = []
match = false
full_ranges.each do |range|
if (r[0] >= range[0] && r[0] <= (range[1] + 1) )
if (r[1] > range[1])
range[1] = r[1]
end
match = true
end
end
full_ranges << r if (!match)
full_ranges.sort_by!{|r|r[0]}
puts full_ranges.size
end
#puts full_ranges.map{|r|"#{r[0]} - #{r[1]}"}.join("\n")
full_ranges.unshift([-1,-1])
full_ranges << [4294967295+1,4294967295+1]
(1...(full_ranges.length)).each do |i|
puts "#{full_ranges[i][0]} - #{(full_ranges[i-1][1] + 1)} = #{full_ranges[i][0] - (full_ranges[i-1][1] + 1)}"
end
puts (1...(full_ranges.length)).map{|i|full_ranges[i][0] - (full_ranges[i-1][1] + 1)}.inject(:+)
end
test_input = "5-8
0-2
4-7"
process(test_input.split("\n"))
process(File.new("day20_input.txt").readlines)