2012-10-01 35 views
4

一襯墊反覆置換我知道如何使用紅寶石創建置換:在紅寶石

x = [*1..6] 
x.permutation.each { |y| p y } 

使得得到的:

[1, 2, 3, 4, 5, 6] 
[1, 2, 3, 4, 6, 5] 
[1, 2, 3, 5, 4, 6] 
[1, 2, 3, 5, 6, 4] 
[1, 2, 3, 6, 4, 5] 
... 
[6, 5, 4, 3, 1, 2] 
[6, 5, 4, 3, 2, 1] 

是否有任何一個襯裏代碼來生成重複排列,如:

x = [1,2,3] 
x.something.each { |y| p y } 

,讓結果:

[1,1,1] 
[1,1,2] 
[1,1,3] 
[1,2,1] 
[1,2,2] 
... 
[3,3,2] 
[3,3,3] 
+1

你問組合,但你的例子顯示重複的排列。你還需要看到真實的組合,例如[1],[2],[3],[1,2],[1,3],[2,3],[1] 1,2,3]'? –

+0

我也是,你確定你有這個術語嗎?請務必花時間瞭解「組合」,「置換」和「重複置換」的含義。 –

+1

啊我看到了,謝謝..這是「重複排列」,我會編輯我的問題。^^ – Kokizzu

回答

10

嘗試#repeated_permutation

[*1..3].repeated_permutation(3).to_a 

> pp [*1..3].repeated_permutation(3).to_a 
[[1, 1, 1], 
[1, 1, 2], 
[1, 1, 3], 
[1, 2, 1], 
[1, 2, 2], 
[1, 2, 3], 
[1, 3, 1], 
[1, 3, 2], 
[1, 3, 3], 
[2, 1, 1], 
[2, 1, 2], 
[2, 1, 3], 
[2, 2, 1], 
[2, 2, 2], 
[2, 2, 3], 
[2, 3, 1], 
[2, 3, 2], 
[2, 3, 3], 
[3, 1, 1], 
[3, 1, 2], 
[3, 1, 3], 
[3, 2, 1], 
[3, 2, 2], 
[3, 2, 3], 
[3, 3, 1], 
[3, 3, 2], 
[3, 3, 3]] 
+0

正是我在找什麼。非常簡潔。 – pisaruk

5

我注意到你的問題問組合但你的例子中使用重複排列。如果你真的有興趣生成實際的組合,那麼一個快速和骯髒的方式來做到這一點:

>> x = [* ?a..?c] 
=> ["a", "b", "c"] 
>> (0..x.length).each{|i| x.combination(i){|y| p y}} 
[] 
["a"] 
["b"] 
["c"] 
["a", "b"] 
["a", "c"] 
["b", "c"] 
["a", "b", "c"] 
+0

我編輯了我的問題,謝謝^^ – Kokizzu

+0

btw,什麼是?a和?c對你的源代碼? – Kokizzu

+1

哦,沒問題,只要確保。從Ruby 1.9.1開始,'?a'就是''a「'。在1.9.1之前它會是97。 –