2012-10-01 245 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。 –