2016-12-13 3 views
1

次のことを達成するには:範囲の1つの配列を取り、それから範囲の別の配列を引きます。例えば数値アルゴリズムの範囲を外します

arr0 = [[0,50],[60,80],[100,150]] # 0-50, 60-80, etc. 

arr1 = [[4,8],[15,20]] # 4-8, 15-20, etc. 

# arr0 - arr1 magic 

result = [[0,3],[9,14],[21,50],[60,80],[100,150]] # 0-3, 9-14, etc. 

Rubyでこれを行うには最もクリーンで効率的な方法は何ですか?

+1

私はドン」 stdlib-poweがあると思うここでは赤いワンライナー –

+0

これはたくさんのテスト/例を必要とします。特に奇妙なコーナーケースの場合。しかし面白そうです。それが[運動](http://exercism.io)の練習だったら、私はそれを解決するだろう:) –

+0

私はすべてのエッジの場合を除いて簡単な解決策はどのようなものかと不思議です。 –

答えて

3

これは意図的にナイーブな解決策です。それは効率的ではありませんが、理解しやすく、かなり短いです。数字のリストに

解体arr0

arr1のための同じ
n1 = arr0.flat_map { |a, b| (a..b).to_a } 
#=> [0, 1, ..., 49, 50, 60, 61, ..., 79, 80, 100, 101, ..., 149, 150] 

n2 = arr1.flat_map { |a, b| (a..b).to_a } 
#=> [4, 5, 6, 7, 8, 15, 16, 17, 18, 19, 20] 

その後、n1からn2を減算し、連続した番号を再結合:

(n1 - n2).chunk_while { |a, b| a.succ == b }.map(&:minmax) 
#=> [[0, 3], [9, 14], [21, 50], [60, 80], [100, 150]] 
関連する問題