我正在尝试解决一个组合/排列问题,我有10个人,他们应该检查其他人的想法。每个人都应该仔细检查3个想法,例如: 人物1:评论2、3、4 人2:评论5,8,9 人3:评论9、10、1 ... 等
限制是:
m
n
。简而言之:在m
人中,每个人应准确地评论n
人,并同时收到n
条评论。
我已经能够在红宝石中找到一些非常有用的方法,例如combination
,基本上让我做这样的事情:
[1,2,3,4,5,6,7,8,9,10].combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 10], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [2, 10], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 10], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [4, 10], [5, 6], [5, 7], [5, 8], [5, 9], [5, 10], [6, 7], [6, 8], [6, 9], [6, 10], [7, 8], [7, 9], [7, 10], [8, 9], [8, 10], [9, 10]]
我还可以将其组合为3 (n)
:
irb(main):008:0> [1,2,3,4,5,6,7,8,9,10].combination(3).to_a
=> [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 2, 8], [1, 2, 9], [1, 2, 10], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 3, 9], [1, 3, 10], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 4, 10], [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 5, 10], [1, 6, 7], [1, 6, 8], [1, 6, 9], [1, 6, 10], [1, 7, 8], [1, 7, 9], [1, 7, 10], [1, 8, 9], [1, 8, 10], [1, 9, 10], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 3, 9], [2, 3, 10], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 4, 10], [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 5, 10], [2, 6, 7], [2, 6, 8], [2, 6, 9], [2, 6, 10], [2, 7, 8], [2, 7, 9], [2, 7, 10], [2, 8, 9], [2, 8, 10], [2, 9, 10], [3, 4, 5], [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 4, 10], [3, 5, 6], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 5, 10], [3, 6, 7], [3, 6, 8], [3, 6, 9], [3, 6, 10], [3, 7, 8], [3, 7, 9], [3, 7, 10], [3, 8, 9], [3, 8, 10], [3, 9, 10], [4, 5, 6], [4, 5, 7], [4, 5, 8], [4, 5, 9], [4, 5, 10], [4, 6, 7], [4, 6, 8], [4, 6, 9], [4, 6, 10], [4, 7, 8], [4, 7, 9], [4, 7, 10], [4, 8, 9], [4, 8, 10], [4, 9, 10], [5, 6, 7], [5, 6, 8], [5, 6, 9], [5, 6, 10], [5, 7, 8], [5, 7, 9], [5, 7, 10], [5, 8, 9], [5, 8, 10], [5, 9, 10], [6, 7, 8], [6, 7, 9], [6, 7, 10], [6, 8, 9], [6, 8, 10], [6, 9, 10], [7, 8, 9], [7, 8, 10], [7, 9, 10], [8, 9, 10]]
但是我不确定如何从这些子数组中挑选出确切的数量,以便每个人都从n
个人中收到m
条评论。也许有一些我不熟悉的与这类问题相关的名字。
谢谢
答案 0 :(得分:2)
给出m号,构建“研究员”数组:
m = 10
fellows = m.times.map{ |i| i }
#=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后,每个人都评论下三个:
n = 3
reviews = fellows.map.with_index.with_object({}) { |(f, i), h| h[f] = fellows.rotate(i)[1..n] }
#=> {0=>[1, 2, 3], 1=>[2, 3, 4], 2=>[3, 4, 5], 3=>[4, 5, 6], 4=>[5, 6, 7], 5=>[6, 7, 8], 6=>[7, 8, 9], 7=>[8, 9, 0], 8=>[9, 0, 1], 9=>[0, 1, 2]}
也许需要随机化吗?
reviews = fellows.shuffle!.map....