ranges = DATA.read .split(?,) .map { it.split(?-).map(&:to_i) } .map { _1.._2 } pp ranges.flat_map {|range| # part one # range.to_a.select { it.to_s =~ /^(.+)\1$/ } range.to_a.select { it.to_s =~ /^(.+)\1+$/ } }.sum __END__