Я искал повсюду, в том числе в архивах Stack Overflow, ответ на вопрос, как это сделать, я пытался свернуть свой собственный, но потерпел неудачу, поэтому решил разместить свой запрос здесь.
Мне нужно взять произвольное (четное) количество элементов в массиве и вернуться с элементом в паре с другим элементом в массиве. Мне нужно, чтобы вывод кода был таким же, как пример вывода, который я включил ниже.
Введите:
('A'..'H').to_a
Выход:
[[['A','H'], ['B','G'], ['C','F'], ['D','E']],
[['A','G'], ['B','F'], ['C','E'], ['D','H']],
[['A','F'], ['B','E'], ['C','D'], ['G','H']],
[['A','E'], ['B','D'], ['C','H'], ['F','G']],
[['A','D'], ['B','C'], ['E','G'], ['F','H']],
[['A','C'], ['B','H'], ['D','G'], ['E','F']],
[['A','B'], ['C','G'], ['D','F'], ['E','H']]]
Есть идеи?
Вот что я сделал до сих пор. Он немного грязный и не возвращается в нужном мне порядке.
items = ('A'..'H').to_a
combinations = []
1.upto(7) do |index|
curitems = items.dup
combination = []
1.upto(items.size / 2) do |i|
team1 = curitems.delete_at(0)
team2 = curitems.delete_at(curitems.size - index) || curitems.delete_at(curitems.size - 1)
combination << [team1, team2]
end
combinations << combination
end
pp combinations
Вывод закрыт, но не в правильном порядке:
[[["A", "H"], ["B", "G"], ["C", "F"], ["D", "E"]],
[["A", "G"], ["B", "F"], ["C", "E"], ["D", "H"]],
[["A", "F"], ["B", "E"], ["C", "D"], ["G", "H"]],
[["A", "E"], ["B", "D"], ["C", "H"], ["F", "G"]],
[["A", "D"], ["B", "C"], ["E", "G"], ["F", "H"]],
[["A", "C"], ["B", "H"], ["D", "E"], ["F", "G"]],
[["A", "B"], ["C", "G"], ["D", "H"], ["E", "F"]]]
Вы заметите, что мой код дает мне две комбинации D <-> H (последняя строка и вторая строка), и это не сработает.
Мое понимание требований ОП [FM]:
- Дано
N
команд (например, 8
команды: A..H
).
- Создать расписание турниров,
состоящий из
R
раундов игры (7
в нашем примере) и G
игр (28 в
наш пример).
- Где каждая команда играет одну команду ровно один раз.
- Где каждая команда играет один раз в каждом раунде.
- И (трудная часть), где
заказ игр в течение раунда
работает так:
- Команда высшего ранга (A) играет
команда с низким рейтингом (H) первая.
- Если кандидатский матч отклонен
за нарушение правила повторения
команда с низким рейтингом на
«задний план» и образуют другие
Первый матч. Тогда сопоставим
отсталые команды, использующие тот же
правила. (Например: во втором раунде
Первый кандидат на матч
A-H
отклонено как повтор, поэтому игра 1 будет
быть A-G
, а H
будет сидеть на спине
горелка, в паре с D
в качестве
последняя игра в раунде).
- При добавлении команд на задний план,
добавить их в начало этого списка
(т.е. сохранить порядок ранга на
задний ход).
- Примечание : Раунд 5 - хитрый.
Первые 2 игры просты.
Третья игра тогда будет
E-H
;
однако это создает сценарий
где 4-я игра будет повторением
(F-G
). Так что алгоритм должен
вернуться назад, отклонить спаривание E-H
и вместо этого перейдите на E-G
в 3-м
игры.