Комбинации заданного массива, упорядочивающие их в разных массивах, чтобы не было двойников

Я делаю футбольного турнирного менеджера для детских игр. Раундов может быть много, и каждая команда в каждом раунде играет друг против друга. Учитывая комбинации каждого тура, мне нужен календарь матчей с наибольшим количеством команд, играющих одновременно. Есть ли способ упорядочить массив комбинаций для достижения результата?

Я пытался "сделать" какой-то алгоритм, но не смог найти лучшего. В предоставленном коде гарантируется, что две команды могут играть одновременно, но не более...

teams = [1,2,3,4,5,6,7,8] # number of teams is variable

pairings = teams.combination(2).to_a
pairings.shuffle!
calendar = []
calendar << pairings.slice!(0)

while pairings.any?
    p = calendar.slice(-1)
    a = p[0]
    b = p[1]
    matched = false
    pairings.each do |pairing|
        next if pairing.include? a
        next if pairing.include? b
        matched = true
        calendar << pairings.delete(pairing)
        break
    end
    unless matched
        p1 = pairings.slice!(0)
        prev = false
        calendar.each do |pairing|
            if pairing.include?(a) || pairing.include?(b)
                prev = true
                next
            end
            unless prev
                i = calendar.index(pairing)
                calendar.insert(i, p1)
                break
            end
            prev = false
        end
    end
end

person 0x24CFB    schedule 15.08.2019    source источник
comment
Попробуйте погуглить «алгоритм кругового турнира». Это может быть соответствующие.   -  person Cary Swoveland    schedule 15.08.2019
comment
Спасибо, я не нашел нужных слов для поиска   -  person 0x24CFB    schedule 15.08.2019


Ответы (1)


Погуглив предложенные условия, я пришел к этому решению, большое спасибо!

teams = [1,2,3,4,5]

teams.push "x" if teams.length.odd?

first = [teams.slice!(0)]

teams.length.times do
    half = Integer(teams.length / 2)
    row1 = first + teams.slice(0...half)
    row2 = teams.slice(half...teams.length).reverse
    for i in 0..half do
        next if row1[i] == "x"
        next if row2[i] == "x"
        puts "#{row1[i]} - #{row2[i]}"
    end
    teams.unshift(teams.pop)
end
person 0x24CFB    schedule 15.08.2019