( 3,0 pontos) Em uma competiçăo de ginástica Olimpica, cada atleta recebo notas de 5 juizes.j As notas variam de 0 a 10 e são armazenadas em uma matriz, onde cada linha representa um atleta rho cada coluna representa a nota dada por um dos juizes. O número de atletas da competiçăo pode variar, de forma que o número de linhas da matriz pode variar.
Você deve implementar uma função chamada medalhistas(notas) que recebe essa matriz como entrada. A funçāo deve calcular a média das notas de cada atleta (ignorando a maior e a menor nota recebida) e retornar uma lista contendo os indices dos três atletas com as malores médias, ordenados do primeiro ao terceiro lugar. Você pode desenvolver funçőes auxillares, se achar necessário.
Regras para o cálculo dalmédia:)
  1. Para cada atleta, remova a maior e a menor nota antes de calcular a média.
  2. Calcule a média das três notas restantes. some % 3
    Segue um exemplo, mostrando a saida esperada para uma dada entrada:
Entrada Saida
notas |l|l| hline Entrada & Saida hline notas $=[$ & $[2,0,1]$ $[9.0,8.5,9.5,9.0,8.0]$, # At<=ta 1 & $[8.5,8.0,8.0,8.5,8.5]$, # At<=ta 2 & $[9.5,9.0,9.5,9.5,9.0]$, # Atteta 3 & $[7.0,8.0,7.5,8.0,7.5]$, # At<=ta 4 & $[8.0,7.5,8.0,8.0,8.0]$, # At<=ta 5 & hline
, # Atleta 1
, # Atleta 2
, # Atteta 3
, # Atleta 4
, # Atleta 5

Passo 1

Beleza, vamos resumir o que a questão pede! Temos uma competição de ginástica olímpica onde cada atleta recebe notas de 5 juízes, variando de 0 a 10. Essas notas estão organizadas em uma matriz, onde cada linha representa um atleta e cada coluna uma nota de um juiz. O número de atletas pode variar, então o número de linhas da matriz também pode mudar.
O que precisamos fazer é criar uma função chamada medalhistas(notas) que vai receber essa matriz de notas e calcular a média das notas de cada atleta. Para calcular essa média, vamos seguir duas regras importantes:
  1. Remover a maior e a menor nota de cada atleta.
  2. Calcular a média das três notas restantes.
Depois disso, a função deve retornar uma lista com os índices dos três atletas que tiveram as maiores médias, ordenados do primeiro ao terceiro lugar.
Para resolver isso, vamos precisar:
  • Entender como manipular listas e matrizes.
  • Saber como encontrar o máximo e o mínimo de uma lista.
  • Calcular médias.
  • Ordenar os atletas com base nas médias calculadas.

Passo 2

Primeiro, vamos pensar em como percorrer cada atleta na matriz de notas. Cada linha da matriz representa um atleta, ent��o vamos iterar por cada linha.
Por exemplo, se tivermos:
notas = [
    [9.0, 8.5, 9.5, 9.0, 8.0],  # Atleta 0
    [8.5, 8.0, 8.0, 8.5, 8.5],  # Atleta 1
    [9.5, 9.0, 9.5, 9.5, 9.0],  # Atleta 2
    [7.0, 8.0, 7.5, 8.0, 7.5],  # Atleta 3
    [8.0, 7.5, 8.0, 8.0, 8.0]   # Atleta 4
]
Vamos percorrer cada atleta (cada sublista) para processar suas notas.

Passo 3

Para cada atleta, precisamos remover a maior e a menor nota antes de calcular a média das três restantes. Em Python, podemos usar as funções max() e min() para encontrar esses valores.
Por exemplo, para o Atleta 0:
notas_atleta = [9.0, 8.5, 9.5, 9.0, 8.0]
maior_nota = max(notas_atleta)  # 9.5
menor_nota = min(notas_atleta)  # 8.0
Agora, vamos remover essas notas da lista. Para isso, podemos usar o método remove() que remove a primeira ocorrência de um valor específico.
notas_atleta.remove(maior_nota)  # Remove 9.5
notas_atleta.remove(menor_nota)   # Remove 8.0
Agora, notas_atleta fica assim: [9.0, 8.5, 9.0]

Passo 4

Depois de remover a maior e a menor nota, vamos calcular a média das três notas restantes. A média é a soma das notas dividida pela quantidade de notas.
Usando o exemplo anterior:
media = sum(notas_atleta) / 3  # (9.0 + 8.5 + 9.0) / 3 = 8.83
Vamos repetir esse processo para todos os atletas e armazenar as médias junto com os índices dos atletas.

Passo 5

Agora que temos as médias de todos os atletas, precisamos identificar os três atletas com as maiores médias. Para isso, vamos criar uma lista de tuplas onde cada tupla contém o índice do atleta e sua respectiva média.
Continuando o exemplo:
medias = [
    (0, 8.83),  # Atleta 0
    (1, 8.33),  # Atleta 1
    (2, 9.33),  # Atleta 2
    (3, 7.67),  # Atleta 3
    (4, 8.00)   # Atleta 4
]
Vamos ordenar essa lista com base nas médias de forma decrescente (do maior para o menor):
medias_ordenadas = sorted(medias, key=lambda x: x[1], reverse=True)
# Resultado: [(2, 9.33), (0, 8.83), (1, 8.33), (4, 8.00), (3, 7.67)]

Passo 6

Por fim, vamos pegar os índices dos três primeiros atletas dessa lista ordenada, que são os três com as maiores médias.
Continuando:
top3 = [medias_ordenadas[0][0], medias_ordenadas[1][0], medias_ordenadas[2][0]]
# Resultado: [2, 0, 1]

Resposta

A função medalhistas(notas) deve retornar a lista [2, 0, 1] para o exemplo fornecido, indicando que os atletas com os maiores desempenhos são o atleta 2, seguido pelo atleta 0 e pelo atleta 1.

Código Completo (Opcional)

def medalhistas(notas):
    medias = []
    for indice, notas_atleta in enumerate(notas):
        maior_nota = max(notas_atleta)
        menor_nota = min(notas_atleta)
        notas_filtradas = notas_atleta.copy()
        notas_filtradas.remove(maior_nota)
        notas_filtradas.remove(menor_nota)
        media = sum(notas_filtradas) / 3
        medias.append((indice, media))
    medias_ordenadas = sorted(medias, key=lambda x: x[1], reverse=True)
    top3 = [medias_ordenadas[0][0], medias_ordenadas[1][0], medias_ordenadas[2][0]]
    return top3

# Exemplo de uso:
notas = [
    [9.0, 8.5, 9.5, 9.0, 8.0],
    [8.5, 8.0, 8.0, 8.5, 8.5],
    [9.5, 9.0, 9.5, 9.5, 9.0],
    [7.0, 8.0, 7.5, 8.0, 7.5],
    [8.0, 7.5, 8.0, 8.0, 8.0]
]

print(medalhistas(notas))  # Saída: [2, 0, 1]

Observação

Lembre-se de que, se houver empates nas médias, a ordenação pode depender da ordem dos atletas na lista original. Certifique-se de que a implementação considera sempre os três primeiros após a ordenação.

Exercícios relacionados