Recursos-LCC

Um arquivo de todo material que consegui reunir, pertinente ao curso de LCC da UM.

View on GitHub

LA2 | Torneio 1 (2021/2022) | Fórmula 1


"""
Implemente uma função que, dada uma lista com registos de instantes de tempo e nome de piloto, 
descrevendo os tempos de passagem pela meta dos varios pilotos numa corrida de F1, 
devolva a lista com os nomes dos pilotos com a volta mais rápida ordenada por ordem alfabética. 
Assuma que todos os pilotos iniciaram a prova no instante 0.
"""

def formula1(log):
    fastest = {}
    log.sort(key = lambda x: x[0])
    for tempo, driver in log:
        if driver not in fastest:
            fastest[driver] = [tempo, tempo]
        else:
            if tempo - fastest[driver][1] < fastest[driver][0]:
                fastest[driver][0] = tempo - fastest[driver][1]
        fastest[driver][1] = tempo
    
    final = []
    for driver, tempo in sorted(fastest.items(), key = lambda x: (x[1][0], x[0]) ):
        if len(final) == 0:
            mintime = tempo[0]
            final.append(driver)
        elif tempo[0] == mintime:
            final.append(driver)

    return final


###################################
#   Minha Resolução
###################################

def formula1(log):
    # Caso vazio
    if log == []:
        return []
    
    pilots = [x[1] for x in log]     # Lista de pilotos
    pilots = list(set(pilots))              # Tira as repetições dos pilotos
    pilots = sorted(pilots, key=lambda x: x)     # Ordena alfabeticamente
    pilotsAndtimes = [[x, [0]] for x in pilots]  # Cria uma lista com [nomepiloto, [tempos]]
    for pt in log:                              # Percorre a lista dada
        for pandt in pilotsAndtimes:     # Percorre a lista dos pilotos e tempo
            if pt[1] == pandt[0]:       # Se os pilotos corresponderem, adiciono o tempo lido à lista de cada piloto em pilotsAndtimes
                pandt[1].append(pt[0])
                pandt[1].sort()
                break

    tempominimo = float("inf")   # Tempo mais rápido de toda a prova
    for y in pilotsAndtimes:     # Percorrer a lista pilotsAndtimes
        tempo = float("inf")            # Tempo mais rápido do piloto
        for i in range(len(y[1]) - 1):       # Percorrer a lista dos tempos
            diferenca = y[1][i+1] - y[1][i]      # Fazer a diferença entre o tempo lido e o a seguir
            if (diferenca) < tempo:         # Se a diferença for menor que o tempo mais rápido do piloto até ao momento, é substituido pela mesma
                tempo = diferenca
        if tempo < tempominimo:      # Se o tempo do piloto for menor do que o tempo mais rápido registado até ao momento, é substituido pelo mesmo
            tempominimo = tempo
        y[1] = tempo                                                    # Substituir a lista dos tempos pelo tempo mais rápido do piloto
    pilotsAndtimes = [x for x in pilotsAndtimes if x[1] == tempominimo]      # Retirar só os pilotos com o tempo menor igual ao mais rápido da corrida
    pilotsAndtimes = [x[0] for x in pilotsAndtimes]                      # Retirar apenas o nome dos pilotos
    return pilotsAndtimes


Testes

# 1
log = [(20,"Alonso"),(20,"Rosberg"),(25,"Hamilton"),(35,"Rosberg"),(50,"Alonso"),(55,"Hamilton"),(70,"Hamilton"),(80,"Rosberg"),(70,"Alonso"),(100,"Alonso"),(120,"Hamilton")]
> Resultado = ['Hamilton', 'Rosberg']

# 2
log = [(20,"Alonso"),(25,"Hamilton"),(50,"Alonso"),(55,"Hamilton"),(70,"Hamilton"),(70,"Alonso")]
> Resultado = ['Hamilton']

retroceder