2012-04-09 18 views
1

配列から数値順にグループ化する必要があります。 (ルビー1.9.2、3.2レールを使用して)ルビーで数値を数値順にグループ化する

Example1: 
[1,2,4,5,6] 

Example2: 
[1,3,4,6,7] 

Example3: 
[1,2,3,5,6] 

Example4: 
[1,2,4,5,7] 

Example1: 
[[1,2],[4,5,6]] 

Example2: 
[[1],[3,4],[6,7]] 

Example3: 
[[1,2,3],[5,6]] 

Example4: 
[[1,2],[4,5],[7]] 

をグループ化した後、あなたのアイデアを得ます。 (私が実際にやっているのは、グループ化の日ですが、関連性はありません)

ありがとうございます!

+1

あなたは正しい、一緒にグループに*連続した*数字をしたいですか? –

答えて

3

私はあなたがこの操作を何と呼ぶのかは分かりませんが、最後に処理された要素に基づいた分類方法の一種です。ような何か:

def groupulate(list) 
    list.inject([ ]) do |result, n| 
    if (result[-1] and result[-1][-1] == n - 1) 
     result[-1] << n 
    else 
     result << [ n ] 
    end 

    result 
    end 
end 

列挙モジュールが処理リストのユーティリティメソッドを多数提供していますが、injectは、これまでで最も柔軟性があります。それはここで実行を参照してください

def group_consecutive(arr) 
    arr.inject([[]]) do |memo, num| 
    if memo.last.count == 0 or memo.last.last == num - 1 
     memo.last << num 
    else 
     memo << [ num ] 
    end 
    memo 
    end 
end 

::でinject(別名reduce)を使用する

+0

これは良い答えです:) –

+0

@ tjdettの答えは同じですが、これを正解とマークすると完璧です。ありがとうございました。 –

+3

['each_with_object'](http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_object)はおそらく' inject'よりも意味があります。反復の間に同じオブジェクト。 –

1
a = [1,2,4,5,7] 
out = [] 
a.each_index do |i| 
    if out.last and out.last.last == a[i]-1 
    out.last << a[i] 
    else 
    out << [a[i]] 
    end 
end 

puts out.inspect 
+0

本当にありがとうございます。 –

+0

私は@ tadmanの答えと一緒に行くと思う:) –

+0

する必要があります! :)楽しい問題! –

2

パーフェクト問題http://rubyfiddle.com/riddles/0d0a5

+1

'inject'を使ったもう一つの答えでも指摘したように、[' each_with_object'](http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_object)はおそらくもっと意味がありますここでは 'inject'よりも同じオブジェクトを反復の間に渡すだけであるからです。 –

関連する問題