Я не могу решить эту чертову ошибку.
Программа не может делать следующее:
Если количество участников не является степенью 2, используются слова «пока» для автоматического перевода определенных участников в следующий раунд.
Например, у вас есть 4 парня в школе А и 2 парня в школе Б.
Его входные данные :
Enter school name (or 'done' to finish): A
Enter players for A (comma-separated): 1,2,3,4
Is 1 a semi-finalist from the last year? (y/n): n
Is 2 a semi-finalist from the last year? (y/n): n
Is 3 a semi-finalist from the last year? (y/n): n
Is 4 a semi-finalist from the last year? (y/n): n
Enter school name (or 'done' to finish): B
Enter players for B (comma-separated): 5,6
Is 5 a semi-finalist from the last year? (y/n): n
Is 6 a semi-finalist from the last year? (y/n): n
Enter school name (or 'done' to finish): done
Его вывод будет:
Pairings for Round 1:
1 (A) vs. 5 (B)
2 (A) vs. 6 (B)
3 (A) vs. 4 (A)
когда его вывод должен быть:
Pairings for Round 1:
1 (A) vs. 5 (B)
2 (A) vs. 6 (B)
Bye: 3 (A)
Bye: 4 (A)
По сути, если есть 3 игрока, в выходных данных должно быть 4 пары.
Если игроков 6, в выходных данных должно быть 8 пар.
Я порылся в программе, чтобы найти способ исправить ошибку, но не нашел ее.
import math
# Define the Player class to store player information
class Player:
def __init__(self, name, school, seed=False):
self.name = name
self.school = school
self.seed = seed
# Function to read player information from user input
def read_players():
players = []
while True:
school_name = input("Enter school name (or 'done' to finish): ").strip()
if school_name.lower() == 'done':
break
player_names = input(f"Enter players for {school_name} (comma-separated): ").strip()
if player_names:
player_names_list = [name.strip() for name in player_names.split(',')]
for player_name in player_names_list:
while True:
seed_status = input(f"Is {player_name} a semi-finalist from the last year? (y/n): ").strip().lower()
if seed_status in ('y', 'n'):
seed = seed_status == 'y'
players.append(Player(player_name, school_name, seed))
break
else:
print("Invalid input. Please enter 'y' or 'n'.")
else:
print("No players entered for the school. Please try again.")
return players
# Function to separate seeded and non-seeded players
def separate_seeds_and_non_seeds(players):
seeds = [player for player in players if player.seed]
non_seeds = [player for player in players if not player.seed]
return seeds, non_seeds
# Function to calculate the number of byes needed to balance the rounds
def balance_byes(players):
count = len(players)
next_power_of_two = math.ceil(math.log(count,2)+1)
byes_needed = next_power_of_two
return byes_needed
# Function to create the first round pairings
def create_first_round(players):
seeds, non_seeds = separate_seeds_and_non_seeds(players)
pairings = []
def can_pair(player1, player2):
return player1.school != player2.school
# Pair seed players with non-seed players, avoiding same school pairings if possible
while seeds and non_seeds:
seed = seeds.pop(0)
opponent = next((p for p in non_seeds if can_pair(seed, p)), non_seeds[0])
non_seeds.remove(opponent)
pairings.append((seed, opponent))
# Handle remaining seed players
while seeds:
seed = seeds.pop(0)
opponent = next((p for p in seeds if can_pair(seed, p)), None)
if opponent:
seeds.remove(opponent)
pairings.append((seed, opponent))
# Handle remaining non-seed players
while len(non_seeds) > 1:
player1 = non_seeds.pop(0)
opponent = next((p for p in non_seeds if can_pair(player1, p)), non_seeds[0])
non_seeds.remove(opponent)
pairings.append((player1, opponent))
if non_seeds:
pairings.append((non_seeds.pop(0), None))
# Balance byes
byes_needed = balance_byes(players)
while byes_needed > 0:
pairings.append((None, None))
byes_needed -= 1
return pairings
# Function to display pairings for a given round
def display_pairings(pairings, round_number):
print(f"\nPairings for Round {round_number}:\n")
with open("pairings.txt", "a", encoding="utf-8") as file:
file.write(f"Pairings for Round {round_number}:\n")
for player1, player2 in pairings:
if player1 and player2:
print(f"{player1.name} ({player1.school}) vs. {player2.name} ({player2.school})")
file.write(f"{player1.name} ({player1.school}) vs. {player2.name} ({player2.school})\n")
elif player1:
print(f"Bye: {player1.name} ({player1.school})")
file.write(f"Bye: {player1.name} ({player1.school})\n")
elif player2:
print(f"Bye: {player2.name} ({player2.school})")
file.write(f"Bye: {player2.name} ({player2.school})\n")
file.write("\n")
# Main program execution
if __name__ == "__main__":
all_players = read_players() # Read player information
pairings = create_first_round(all_players) # Create first round pairings
display_pairings(pairings, 1) # Display the pairings for the first round
Подробнее здесь: https://stackoverflow.com/questions/790 ... -number-of
Моя программа не может генерировать количество пар, равное степени 2, если количество участников не является степенью 2. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Discord.py guild.members возвращает только 4 участников вместо всех участников
Anonymous » » в форуме Python - 0 Ответы
- 171 Просмотры
-
Последнее сообщение Anonymous
-