【发布时间】:2017-06-06 15:54:55
【问题描述】:
我有一个使用 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_pairs,直到 available_combinations 不再有足够的对。
【问题讨论】:
-
“公平”是什么意思?你能举一个“公平订购”的例子吗?公平地说,您的要求是特定于 这个数组 的吗?因为我不知道您一般会期望看到什么行为。
-
例如...如果您的(不寻常的)要求实际上是“我想获得 4 个元素对数组,没有重复”,那么您可以这样做:
a.uniq.sample(8).each_slice(2).to_a -
我在我的问题中添加了更多信息,希望这样更清楚。
-
请编辑您的问题以包含您目前编写的代码。
-
@Xizam 那就是所谓的“循环赛”锦标赛。维基百科给出了一些算法。