Моя программа не может генерировать количество пар, равное степени 2, если количество участников не является степенью 2.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Моя программа не может генерировать количество пар, равное степени 2, если количество участников не является степенью 2.

Сообщение Anonymous »

Я не могу решить эту чертову ошибку.
Программа не может делать следующее:
Если количество участников не является степенью 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»