Arrays 在';公平';方式

Arrays 在';公平';方式,arrays,ruby,sorting,Arrays,Ruby,Sorting,我用N=9创建了一个数组 a = [1,2,3,4,5,6,7,8,9] b = a.combination(2).to_a 我想一次取出子数组的N%2,没有两次出现数字,例如第一次是: [[1,2],[3,4],[5,6],[7,8]] 这意味着9没有被选中。第二次我会把它拿出来 [[1,3],[2,4],[5,7],[6,8]] 再次9没有被挑选。 最终,我会被留下来 [[1,9],[2,9],[3,9],[4,9],[5,9],[6, 9],[7, 9],[8, 9]] 这意味着

我用N=9创建了一个数组

a = [1,2,3,4,5,6,7,8,9]
b = a.combination(2).to_a
我想一次取出子数组的
N%2
,没有两次出现数字,例如第一次是:

[[1,2],[3,4],[5,6],[7,8]]
这意味着9没有被选中。第二次我会把它拿出来

[[1,3],[2,4],[5,7],[6,8]]
再次9没有被挑选。 最终,我会被留下来

 [[1,9],[2,9],[3,9],[4,9],[5,9],[6, 9],[7, 9],[8, 9]]
这意味着我不能再选择4个没有重复数字的数组

如何对数组进行排序,使每个数字只保留一次而不是一直保留9

用例如下所示:

students = [1,2,3,4,5,6,7,8,9]
available_combinations = a.combination(2).to_a

def make_pairs
 available_students = students
 while available_students.length > 1 do
  student_combination = find_sub_array(available_combinations, available_students.first, available_students)
   available_combinations.delete(student_combination)
   available_students -= student_combination
 end
end

 def find_sub_array(available_combinations, student, available_students)
 available_combinations.each do |subarray|
  if subarray.include?(student) && (subarray - available_students).empty?
    return subarray
  end
 end
end

我想多次运行make\u pairs,直到可用的\u组合不再有足够的对剩余。

对于奇数,只需添加另一个伪数,如
0
:再见

students = [1,2,3,4,5,6,7,8,9,:bye]
现在,当您拉动n%2对时,至少有一对将与a:再见配对。那是那一对中的古怪学生。每个学生将有相同数量的:再见轮


编辑:我假设您在本例中拉动5对,并使用:bye丢弃这对,以确保不会重复。

什么是“公平”的意思?你能举一个“公平订购”的例子吗?公平地说,您的需求特定于此阵列吗?因为我不知道你通常会看到什么样的行为。例如。。。如果您的(不寻常的)要求实际上是“我想得到4个元素对数组,没有重复项”,那么您可以这样做:
a.uniq.sample(8)。每个片段(2)。为了给我的问题添加更多信息,希望这样更清楚。请编辑您的问题,以包含您迄今为止编写的代码。@Xizam那么这就是所谓的“循环赛”。维基百科提供了一些算法。这在当前系统中不起作用。如果有9个学生和1个bye,算法将在第二次迭代中陷入困境,其中学生9和bye将是连续第二次剩下的唯一两个。在本例中,您必须拉动5对,并丢弃带有:bye的一对以使其工作。