我有什么
a = [1,2,3,4]
=> [1, 2, 3, 4]
b = a.combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
b.each_slice(2).to_a
=> [[[1, 2], [1, 3]], [[1, 4], [2, 3]], [[2, 4], [3, 4]]]
我想要实现的是一种独特的组合
=> [[[1, 2], [3, 4]], [[1, 4], [2, 3]], [[1, 3], [2, 4]]]
我尝试过置换,扁平化和& c。但是找不到神奇的红宝石代码!
编辑:
上面的答案就像是
b = a.combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
更准确。
这
a = [1,2,3,4,5,6]
如何获得
=> [[[1, 2], [3, 4], [5, 6]], [[1, 3], [2, 5], [4, 6]], [[1, 4], [2, 6], [3, 5]], [[1, 5], [2, 4], [3, 6]], [[1, 6], [2, 3], [4, 5]]]
这是5个uniq值数组(1,2,3,4,5,6):
[1, 2], [3, 4], [5, 6]
[1, 3], [2, 5], [4, 6]
[1, 4], [2, 6], [3, 5]
[1, 5], [2, 4], [3, 6]
[1, 6], [2, 3], [4, 5]
你似乎改变了这个问题。最初你需要一个数组数组,每个数组都有一对数组。现在你想要三胞胎吗?
是的,因为[1,2,3,4]的第一个例子太容易了,答案不适合更复杂的数组,如[1,2,3,4,5,6]和所以一个。
答案 0 :(得分:1)
这可以让你了解我的大部分方式
[1,2,3,4].combination(2).inject([]){|arr,r| arr << (Hash[*r]); arr}
如果你迭代地从这个数组中取出第一个和最后一个元素,那么你得到的就是
def con(h, arr = [])
arr <<[h.delete(h.first).to_a.flatten, h.delete(h.last).to_a.flatten]
con(h, arr) unless h.empty?
p arr
end
#=> [[[1, 2], [3, 4]], [[1, 3], [2, 4]], [[1, 4], [2, 3]]]
答案 1 :(得分:0)
嗯,它不漂亮,但它确实有效。组合需要一个块。
a = [1,2,3,4]
ans = []
a.combination(2) do |i|
a.combination(2) do |j|
x = [i, j]
y = x.flatten
next if y.uniq != y
ans << x
end
end
puts ans.inspect
编辑:让它稍微不那么难看。
答案 2 :(得分:0)
将此添加为另一个答案,因为它实际上是一个稍微不同的问题 - 而且更难了!
def accept(a)
0.upto(a.size-1){|i| return false unless a[i] == a[i].sort
return false if (i > 0 && a[i][0] <= a[i-1][0])}
true
end
x=[1,2,3,4,5,6].permutation.inject([]){|arr, per| arr<< per.in_groups_of(2); arr}
arr = x.inject([]){|arr,y| arr << y if accept(y); arr}
p arr
不是很漂亮,但我认为你想要的任何大小的阵列
答案 3 :(得分:0)
最后,我找到了一个没有置换,uniq,组合,展平的解决方案:)
a = [1,2,3,4,5,6]
count = a.count
totalloop = count - 1
arrayperloop = count / 2
rounds = []
for round in 0...totalloop
for i in 0...arrayperloop
x = (round + i) % (count - 1)
y = (count - 1 - i + round) % (count - 1)
if i == 0
y = count - 1
end
rounds<<[x + 1, y + 1]
end
end
rounds.each_slice(arrayperloop).to_a给我我想要的东西
[[[1, 6], [2, 5], [3, 4]], [[2, 6], [3, 1], [4, 5]], [[3, 6], [4, 2], [5, 1]], [[4, 6], [5, 3], [1, 2]], [[5, 6], [1, 4], [2, 3]]]
不那么难看!如果我们在数组中添加n * 2整数,它总能工作。