-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path20_firewall_rules.rb
More file actions
30 lines (27 loc) · 867 Bytes
/
20_firewall_rules.rb
File metadata and controls
30 lines (27 loc) · 867 Bytes
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
# Assumes without checking that input intervals are sorted by start time.
def min_unblock(intervals)
unblocked = 0
intervals.each { |min, max|
return unblocked if min > unblocked
unblocked = [unblocked, max + 1].max
}
end
# Assumes without checking that input intervals are sorted by start time.
def merge(intervals, merge_adjacent: true)
prev_min, prev_max = intervals.first
(intervals.each_with_object([]) { |r, merged|
min, max = r
if min > prev_max + (merge_adjacent ? 1 : 0)
merged << [prev_min, prev_max].freeze
prev_min, prev_max = r
else
prev_max = [prev_max, max].max
end
} << [prev_min, prev_max].freeze).freeze
end
ranges = ARGF.map { |l|
# min, max
l.split(?-).map(&method(:Integer)).freeze
}.sort.freeze
puts min_unblock(ranges)
puts 2 ** 32 - merge(ranges).sum { |min, max| (max - min + 1) }