将数组中的项与唯一组中的项配对

时间:2013-03-05 19:03:07

标签: ruby combinatorics

我有一组数字([1,2,3,4,5,6,7,8,9,10])。这些数字代表球员。我希望这些玩家能够彼此“玩”一次。

我需要为这些游戏创造“回合”。这些回合将包括偶数次比赛,每个玩家最多只能进行一轮比赛。如果有一些奇数的比赛,那么比赛数量不规则的最后一轮比赛是可以的。

最终结果是“Round”数组的数组。这些圆形阵列将包含玩家之间的匹配。最终结果如下所示,但完整:

[[[1,2],[3,4],[5,6],[7,8],[9,10]],[[1,3],[2,4],[5,7],[6,8],[9,1],[10,2]]]

我发现Array#combination用于创建匹配项,但我似乎无法正常构建。

1 个答案:

答案 0 :(得分:2)

这称为循环赛。维基百科提供以下algorithm

Round 1. (1 plays 14, 2 plays 13, ... )
 1  2  3  4  5  6  7
 14 13 12 11 10 9  8

然后修复一个竞争对手(本例中为第一个)并顺时针旋转其他一个位置:

Round 2. (1 plays 13, 14 plays 12, ... )
 1  14 2  3  4  5  6
 13 12 11 10 9  8  7

继续旋转:

Round 3. (1 plays 12, 13 plays 11, ... )
 1  13 14 2  3  4  5
 12 11 10 9  8  7  6

每轮玩家只有一个玩家处理奇数玩家,没有游戏(通常通过添加虚拟玩家来实现)。