#!/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