Я пытаюсь написать рутину, которая в основном делает «посев» для команд, как и недавний турнир по баскетболу NCAA, применяется к командам для гольфа, где часто бывает странно количество игроков. Баскетбол легко, есть 64 команды и 4 скобки, а самое высокое семя - самое низкое семя. Мой немного сложнее.Ищете подход к созданию сборных гольф-команд для мини-турнира
Если у меня есть 13 игроков, которые появятся на игру, там будет 4 команды, 1 четверка и 3 тройки. Игроки будут отсортированы по квоте/гандикапу. Игрок 1 является самым высоким игроком, а игрок 13 является самым низким. Цель состоит в том, чтобы навыки каждой команды распределялись как можно более равномерно. У меня на самом деле это работает, но это действительно уродливый код, и я пытаюсь перефразировать его во что-то похожее на рубин вместо базового!
Я использовал несколько вариантов массивов. Если я начинаю с массивом из 13 игроков:
[1,2,3,4,5,6,7,8,9,10,11,12,13]
Я могу разбить его на семена, первое, чтобы заботиться о четверке (обычно называемые ABCD группы)
[[1,2,3,4],[5,6,7],[8,9,10],[11,12,13]]
Чтобы получить даже распределение, самый высокий игрок в группе А будет играть с самым низким игроком в группе B, самым высоким игроком в группе C и самым низким игроком в группе D. После того, как четверка сформирована, остальные игроки будут группами в 3 семени, ABC и некоторый тип подпрограммы, применяемой к 3 группам. Она заканчивающиеся команды будет:
[[1,7,8,13]] # foursome, 1st team
[[2,3,4],[5,6,9],[10,11,12]] # remaining players ofter first team formed and seeded into 3 group
С тройкой, я бы поставил самый высокий игрок в группе А с самым низким игроком в группе В и высшей игрок в группе C. Окончательные результаты должны быть что-то подобное.
[[1,7,8,13],[2,9,10],[3,6,11],[4,5,12]]
Если у вас 15 игроков показать, что будет 3 и 1 четверки втроём и вы получите команды хотели.
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15]]
[[1,8,9,15],[2,7,10,14],[3,6,11,13],[4,5,9]]
Мой метод высева достаточно сложен, и все перенесение, поппинг и уплощение формировать команды хуже. Мне просто интересно, есть ли у кого-нибудь предложения по другому подходу.
def seed_sample(count,make_up='')
players = [] # init an empty array
1.upto(count) do |i|
players << i
end # => [1,2,3,4,5,6,...,count]
abcd = [] #init empty seed array
if make_up == 'foursomes'
4.times{abcd << players.shift(count/4)}
elsif make_up == 'threesomes'
3.times{abcd << players.shift(count/3)}
elsif make_up == 'twosomes'
2.times{abcd << players.shift(count/2)}
else #mixed
a_pop = (count/4) + 1 # number of a players to put in seed stack
abcd << players.shift(a_pop) # A players, always first
rem = players.count # s array is reduced by a_pop, so get count
if rem.modulo(3).zero?
3.times{abcd << players.shift(rem/3)} # B & C & D players
elsif rem.modulo(3) == 1
abcd << players.shift(a_pop) # B players
2.times{abcd << players.shift(rem/3)} # C & D players
else # rem.modulo(3) == 2
2.times{abcd << players.shift(a_pop)}# B & C players
abcd << players # remainder = D players
end
end
@seeds = abcd
return abcd
end
Принимая предложения от RyanK, я уже в пути. Ниже приведен пример тестового семенного метода, который также формирует команды. Вся информация известна из класса, поэтому мне просто нужно заменить около 100 строк кода, если только это не может быть улучшено.
def test_seed(count,fours=nil,threes=nil,twos=nil)
players = Array(1..count) # => [1,2,3,4,5,6,...,count]
abcd = [] #init empty seed array
fours.times{abcd << players.shift(4)} if fours.present?
threes.times{abcd << players.shift(3)} if threes.present?
twos.times{abcd << players.shift(2)} if twos.present?
abcd.each_index do |s| # reverse odd stacks to distribute skills
unless s.modulo(2).zero?
abcd[s].reverse!
end
end
# shuffle stacks by taking card off top of each stack
seeded = []
abcd.count.times do
abcd.each_index do |i|
seeded << abcd[i].shift if abcd[i].present?
end
end
# now lets put the teams together
@teams = []
fours.times{@teams << seeded.shift(4)} if fours.present?
threes.times{@teams << seeded.shift(3)} if threes.present?
twos.times{@teams << seeded.shift(2)} if twos.present?
return abcd,seeded, @teams
end
Не было бы проще равномерно разделить их (как можно лучше) по одному, вроде как раздавать игровые карты в карточной игре? Таким образом, ваш пример превратится в '[[1,5,9,13], [2,6,10], [3,7,11], [4,8,12]]'. –
Мне нужно подумать об этом немного. Проблема заключается в «равномерном разделении» без кучи кода. Если я смогу очистить получение [[1,2,3,4], [5,6,7], [8,9,10], [11,12,13]], я мог бы изменить второй и четвертый элементы и раздайте 1 карту из каждого стека. Мы на самом деле использовали карты для создания команд вручную, но это было случайным, а не посеянным. Что мне нужно, это сложная колода! – appleII717