Ruby 成对均匀分布数组,组合/置换问题
我试图解决一个组合/排列问题,我有10个人,他们应该审查其他人的想法。每个人应准确回顾3个想法,例如: 第1人:评论2、3、4 第2人:评论5,8,9 第三人:评论9、10、1 ... 等等 这些限制是:Ruby 成对均匀分布数组,组合/置换问题,ruby,combinations,permutation,Ruby,Combinations,Permutation,我试图解决一个组合/排列问题,我有10个人,他们应该审查其他人的想法。每个人应准确回顾3个想法,例如: 第1人:评论2、3、4 第2人:评论5,8,9 第三人:评论9、10、1 ... 等等 这些限制是: 10是一个动态数字,因此解决方案也应该是动态的,让我们调用这个变量m 3也是一个动态数字,因此解决方案也适用于其他数字,让我们调用此变量n 子阵列的选择(谁审查谁)应该是随机的,如果相同的10个人参加了2个不同的测试,他们不应该一遍又一遍地评估同一个人 简言之:在一群m人中,每个人都应该准确地
m
n
m
人中,每个人都应该准确地审查n
人,同时接受n
审查
我已经能够在ruby中找到一些非常有用的方法,比如组合
,基本上让我做一些类似的事情:
[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)
:
然而,我不知道如何从这些子数组中挑选出确切的数量,以便每个人从m
人中接收n
评论。也许有一些名字和这类问题有关,我不太熟悉
谢谢你给了m个数字来建立一个“伙伴”阵列: 然后,每个人回顾接下来的三个:
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....
简化为
fellows=0.upto(m-1);fellows.zip(fellows.cycle.each_cons(n)).to_h
我不认为你遗漏了什么。我建议你删除第一句话。注:fellows=(0..m-1)。致@engineersmnky,谢谢<代码>循环
,我忘了。我发布了我想出的第一个工作代码。另外,我认为它应该reviews=fellows.shuffle!。地图…
,砰!,工作properly@iGian这一切都取决于想要的结果是什么shuffle
将导致键和值被洗牌,其中asshuffle
将只导致键被洗牌。我仍然不清楚期望的输出是什么,即使这是一个很好的方法。起初,我不能100%确定仅仅旋转是否适用于m
的每种情况,从分类的角度看它使理解变得非常简单。非常感谢。
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....