2016-09-21 18 views
2

私はインクリメンタル(+1)シーケンスの連結セットからなる配列を持っています。シーケンスの最初と最後の要素を返します

sequences = [2,3,4,7,12,13,14,15] 

私は、各シーケンスの最初と最後の要素を取得し、それらの値を持つ配列を返すようにしようとしている。ここでは3つのシーケンスを持つ例です。上記の配列から、結果は次のようになります。

[[2,4][7,7][12,15]] 

私は私が仕事だろうと思ったが、それは唯一の最初のシーケンスを返します。このかなり単純な解決策を作ってみました。どんな考え?そして/または、より良い解決策の提案?

new_array = [] 
start_point = sequences[0] 
end_point = sequences[0] 

sequences.map do |element| 
    if element == end_point + 1 
    end_point = element 
    elsif element == end_point 
    next 
    else 
    new_array << [start_point, end_point] 
    startpoint = element 
    end_point = element 
    end 
end 
return new_array 
+1

あなたはCで考えているのにRubyで書いてみるといくつかのボーナスポイントが必要です!しかし、Rubyでこれを行うと、ひどく非効率的なコードになることがよくあります。代わりに、可能な限り、 'map'、' inject'、 'tap'、' select'のような組み込みの関数型プログラミングのesqueメソッドを使用してください。これらのメソッドはすべてC言語で実装されているため、アルゴリズムを実行する際にはインタプリタの処理が大幅に減ります。 – Sean

答えて

5

あなたは連続した数字を見つけるためにchunk_whileを使用することができます。

sequences.chunk_while { |i, j| i + 1 == j }.to_a 
#=> [[2, 3, 4], [7], [12, 13, 14, 15]] 

各サブ配列の最初と最後の要素を抽出するvalues_atとともにmap(これはまた、ドキュメントの例です):

sequences.chunk_while { |i, j| i + 1 == j }.map { |a| a.values_at(0, -1) } 
#=> [[2, 4], [7, 7], [12, 15]] 

以上の冗長:

....map { |a| [a.first, a.last] } 
関連する問題