1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fresh, available = DATA.read.split("\n\n")
fresh = fresh.scan(/(\d+)-(\d+)/).map { Range.new(*it.map(&:to_i)) }
available = available.lines.map(&:to_i)

pp available.count {|id| fresh.any? {|range| range.cover?(id) }}

ranges = fresh
  .sort_by { [it.begin, it.end] }
  .chunk_while { _1.end >= _2.begin }
  .map {|ranges|
    Range.new(ranges[0].min, ranges.map(&:end).max)
  }

pp ranges.sum(&:size)

__END__