2011-06-28 23 views
2

我需要使用ruby生成數字的組合。 例如:如何使用ruby生成數字的組合?

ARR = [1,2,3,4,5]

約束是,組合號碼應該包括數字5和長度爲至少3或以上。 (即125,521,1245等)。上述數組元素(值1到5)可能在組合編號中出現一次或兩次或更多次。

+0

是的,我上面提到..我有一個數組(arr = [1,2,3,4,5])。所以,我需要生成數字的組合(125,325,1245 ...等等。這是我的預期輸出)。但是,數字5應該包含在組合數中。 –

+0

當我發佈我的評論後,我明白你的意思,所以我刪除了它。有趣的問題。我想知道你需要什麼。我想知道是否有人提出了一個優雅的答案。 – Mischa

+0

:-)不錯!感謝mischa。如果你喜歡這個問題,請爲我投票。 –

回答

6

試試這個:

arr = [1, 2, 3, 4, 5] 
arr = arr * 5 
out = [] 
3.upto(5) do |i| 
    arr.combination(i) do |c| 
    out << c if c.include? 5 
    end 
end 
out = out.uniq.sort 
puts out.inspect 

# yields 2531 elements: 
# [[1, 1, 1, 1, 5], [1, 1, 1, 2, 5], ... [2, 3, 5], ... [5, 5, 5, 5, 5]] 
+0

優秀和深思熟慮的答案。以下是一些建議。而不是arr = arr * 5,請嘗試arr * = 5而不是out = out.uniq.sort嘗試out.uniq!sort! – Darkmouse

5

[編輯]功能的方法(需要Ruby 1.9):

xs = 3.upto(5).flat_map do |length| 
    [1, 2, 3, 4, 5].repeated_permutation(length).select do |permutation| 
    permutation.include?(5) 
    end 
end 
xs.size # 2531 
+0

這不允許數字在結果數組中出現多次。 –

+0

@Mladen:是的,好吧,我的回答後問題發生了變化。更新。 – tokland

0
arr = [1,2,3,4,5] 
combos = []    
for i in 3..arr.length 
    combos.push(arr.repeated_combination(i).to_a) 
end 
combos.flatten(1).select{|c|c.include?(5)} 

在這裏我創建一個臨時變量容器連擊將存儲數組中有3個或更多數字的每個組合。我然後過濾陣列只包含組合包含5.

+0

感謝分享。 –