2025-12-05 06:40:39 +00:00

48 lines
1.1 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
class Main
def run
ranges = []
$stdin.each_line do |line|
arr = line.chomp.split("-").map(&:to_i)
if arr.size == 2
ranges << (arr[0]..arr[1])
end
end
# Sort ranges by starting point
# This prevents having to check all previous ranges for every new range
ranges.sort_by!(&:begin)
valid_id_ranges = []
ranges.each do |r|
valid_id_ranges.each do |vr|
if (
# r starts inside vr
r.begin >= vr.begin && r.begin <= vr.end) ||
# r ends inside vr
(r.end >= vr.begin && r.end <= vr.end) ||
# vr starts inside r
(vr.begin >= r.begin && vr.begin <= r.end) ||
# vr ends inside r
(vr.end >= r.begin && vr.end <= r.end)
# Merge ranges
r = ([r.begin, vr.begin].min..[r.end, vr.end].max)
valid_id_ranges.delete(vr)
end
end
valid_id_ranges << r
end
@total = 0
valid_id_ranges.each do |r|
@total += (r.end - r.begin + 1)
end
puts @total
end
end
Main.new.run