1
0
mirror of https://github.com/jcwimer/wrestlingApp synced 2026-03-25 01:14:43 +00:00

Fixed random seeding for double elimination. Since bracket positions are already evenly distributed on top half and bottom half of the bracket, I only need to pick odd or even bracket line numbers.

This commit is contained in:
2026-01-23 17:35:16 -05:00
parent 556090c16b
commit 9c2a9d62ad
2 changed files with 24 additions and 21 deletions

View File

@@ -18,19 +18,14 @@ class TournamentSeeding
def random_seeding(wrestlers, bracket_size)
half_of_bracket = bracket_size / 2
available_bracket_lines = (1..bracket_size).to_a
first_half_available_bracket_lines = (1..half_of_bracket).to_a
first_line_of_second_half_of_bracket = half_of_bracket + 1
second_half_available_bracket_lines = (first_line_of_second_half_of_bracket..bracket_size).to_a
# remove bracket lines that are taken from available_bracket_lines
wrestlers_with_bracket_lines = wrestlers.select{|w| w.bracket_line != nil }
wrestlers_with_bracket_lines.each do |wrestler|
available_bracket_lines.delete(wrestler.bracket_line)
first_half_available_bracket_lines.delete(wrestler.bracket_line)
second_half_available_bracket_lines.delete(wrestler.bracket_line)
end
available_bracket_lines_to_use = set_random_seeding_bracket_line_order(first_half_available_bracket_lines, second_half_available_bracket_lines)
available_bracket_lines_to_use = set_random_seeding_bracket_line_order(available_bracket_lines)
wrestlers_without_bracket_lines = wrestlers.select{|w| w.bracket_line == nil }
if @tournament.tournament_type == "Pool to bracket"
@@ -84,7 +79,7 @@ class TournamentSeeding
private
def set_random_seeding_bracket_line_order(first_half_lines, second_half_lines)
def set_random_seeding_bracket_line_order(available_bracket_lines)
# This method prevents double BYEs in round 1
# It also evenly distributes matches from the top half of the bracket to the bottom half
# It does both of these while keeping the randomness of the line assignment
@@ -94,22 +89,11 @@ class TournamentSeeding
# sort by odd or even based on the sample above
if odd_or_even_sample == 1
# odd numbers first
sorted_first_half_lines = first_half_lines.sort_by { |n| n.even? ? 1 : 0 }
sorted_second_half_lines = second_half_lines.sort_by { |n| n.even? ? 1 : 0 }
result = available_bracket_lines.sort_by { |n| n.even? ? 1 : 0 }
else
# even numbers first
sorted_first_half_lines = first_half_lines.sort_by { |n| n.odd? ? 1 : 0 }
sorted_second_half_lines = second_half_lines.sort_by { |n| n.odd? ? 1 : 0 }
result = available_bracket_lines.sort_by { |n| n.odd? ? 1 : 0 }
end
# zip requires either even arrays or the receiver to be the bigger list
if first_half_lines.size >= second_half_lines.size
result = sorted_first_half_lines.zip(sorted_second_half_lines).flatten
else
result = sorted_second_half_lines.zip(sorted_first_half_lines).flatten
end
result.compact
result.delete(nil)
result
end
end