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__