我需要使用ruby生成數字的組合。 例如:如何使用ruby生成數字的組合?
ARR = [1,2,3,4,5]
約束是,組合號碼應該包括數字5和長度爲至少3或以上。 (即125,521,1245等)。上述數組元素(值1到5)可能在組合編號中出現一次或兩次或更多次。
我需要使用ruby生成數字的組合。 例如:如何使用ruby生成數字的組合?
ARR = [1,2,3,4,5]
約束是,組合號碼應該包括數字5和長度爲至少3或以上。 (即125,521,1245等)。上述數組元素(值1到5)可能在組合編號中出現一次或兩次或更多次。
試試這個:
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]]
優秀和深思熟慮的答案。以下是一些建議。而不是arr = arr * 5,請嘗試arr * = 5而不是out = out.uniq.sort嘗試out.uniq!sort! – Darkmouse
[編輯]功能的方法(需要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
這不允許數字在結果數組中出現多次。 –
@Mladen:是的,好吧,我的回答後問題發生了變化。更新。 – tokland
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.
感謝分享。 –
是的,我上面提到..我有一個數組(arr = [1,2,3,4,5])。所以,我需要生成數字的組合(125,325,1245 ...等等。這是我的預期輸出)。但是,數字5應該包含在組合數中。 –
當我發佈我的評論後,我明白你的意思,所以我刪除了它。有趣的問題。我想知道你需要什麼。我想知道是否有人提出了一個優雅的答案。 – Mischa
:-)不錯!感謝mischa。如果你喜歡這個問題,請爲我投票。 –