Possível erro na lógica, o código PHP retorna o tempo total de corrida de cada piloto sem adicionar o tempo da última volta

20/12/2023

0

Eu tenho um log com informações de uma corrida e através dele preciso retornar algumas respostas. A última etapa pede para retornar o tempo total da corrida para cada piloto, mas tudo o que tento não funciona e sempre retorna o resultado sem contar a última volta.


Observações
- A primeira linha do log pode ser desconsiderada (Hora, Piloto, Nº Volta, Tempo Volta, Velocidade média da volta).
- A corrida termina quando o primeiro colocado completa 4 voltas
- S.VETTEL não terminou a corrida


Log.txt
Hora Piloto Nº Volta Tempo Volta Velocidade média da volta
23:49:08.277 038 – F.MASSA 1 1:02.852 44,275
23:49:10.858 033 – R.BARRICHELLO 1 1:04.352 43,243
23:49:11.075 002 – K.RAIKKONEN 1 1:04.108 43,408
23:49:12.667 023 – M.WEBBER 1 1:04.414 43,202
23:49:30.976 015 – F.ALONSO 1 1:18.456 35,47
23:50:11.447 038 – F.MASSA 2 1:03.170 44,053
23:50:14.860 033 – R.BARRICHELLO 2 1:04.002 43,48
23:50:15.057 002 – K.RAIKKONEN 2 1:03.982 43,493
23:50:17.472 023 – M.WEBBER 2 1:04.805 42,941
23:50:37.987 015 – F.ALONSO 2 1:07.011 41,528
23:51:14.216 038 – F.MASSA 3 1:02.769 44,334
23:51:18.576 033 – R.BARRICHELLO 3 1:03.716 43,675
23:51:19.044 002 – K.RAIKKONEN 3 1:03.987 43,49
23:51:21.759 023 – M.WEBBER 3 1:04.287 43,287
23:51:46.691 015 – F.ALONSO 3 1:08.704 40,504
23:52:01.796 011 – S.VETTEL 1 3:31.315 13,169
23:52:17.003 038 – F.MASS 4 1:02.787 44,321
23:52:22.586 033 – R.BARRICHELLO 4 1:04.010 43,474
23:52:22.120 002 – K.RAIKKONEN 4 1:03.076 44,118
23:52:25.975 023 – M.WEBBER 4 1:04.216 43,335
23:53:06.741 015 – F.ALONSO 4 1:20.050 34,763
23:53:39.660 011 – S.VETTEL 2 1:37.864 28,435
23:54:57.757 011 – S.VETTEL 3 1:18.097 35,633


Código:
<?php

// Abre o arquivo de log
$arquivo = fopen("log.txt", "r") or die("Não foi possível abrir o arquivo!");

// Ignora a primeira linha
fgets($arquivo);

// Inicializa um array para armazenar os resultados da corrida
$resultadosCorrida = [];

// Lê o arquivo linha por linha
while (!feof($arquivo)) {
    // Obtém a linha atual
    $linha = fgets($arquivo);

    // Divide a linha em partes
    $partes = explode(" ", $linha);

    // Extrai os dados necessários
    $codigoPiloto = $partes[1];
    $numeroVolta = $partes[2];
    $tempoVolta = $partes[3];

    // Verifica se o piloto já está nos resultados da corrida
    if (!isset($resultadosCorrida[$codigoPiloto])) {
        // Analisa corretamente o nome do piloto usando uma expressão regular
        preg_match('/\d+ – (.+?)\s/', $linha, $correspondencias);
        $nomePiloto = $correspondencias[1];

        // Obtém apenas o código do piloto
        $codigoPiloto = substr($codigoPiloto, 0, 3);

        // Inicializa os dados do piloto
        $resultadosCorrida[$codigoPiloto] = [
            'codigoPiloto' => $codigoPiloto,
            'nomePiloto' => $nomePiloto,
            'voltasCompletadas' => 0,
            'tempoTotalCorrida' => 0,
            'temposVolta' => [],  // Array para armazenar os tempos de cada volta
        ];
    }

    // Atualiza os dados do piloto
    $resultadosCorrida[$codigoPiloto]['voltasCompletadas']++;

    // Armazena o tempo de cada volta para calcular o tempo total corretamente
    $tempoVolta = strtotime($partes[0]);
    $resultadosCorrida[$codigoPiloto]['temposVolta'][] = $tempoVolta;

    // Se for a última volta, calcula o tempo total da corrida
    if ($resultadosCorrida[$codigoPiloto]['voltasCompletadas'] == 4) {
        $tempoTotal = end($resultadosCorrida[$codigoPiloto]['temposVolta']) - reset($resultadosCorrida[$codigoPiloto]['temposVolta']);
        $resultadosCorrida[$codigoPiloto]['tempoTotalCorrida'] = $tempoTotal;
    }
}

// Fecha o arquivo
fclose($arquivo);

// Ordena os resultados pelo número de voltas completadas e tempo total de corrida
usort($resultadosCorrida, function ($a, $b) {
    if ($a['voltasCompletadas'] == $b['voltasCompletadas']) {
        return $a['tempoTotalCorrida'] <=> $b['tempoTotalCorrida'];
    }
    return $b['voltasCompletadas'] <=> $a['voltasCompletadas'];
});

// Imprime os resultados da corrida
foreach ($resultadosCorrida as $posicao => $piloto) {
    // Adiciona a posição de chegada
    $piloto['posicaoChegada'] = $posicao + 1;

    // Exibe os resultados
    echo "Posição de Chegada: " . $piloto['posicaoChegada'] . "<br>";
    echo "Código do Piloto: " . $piloto['codigoPiloto'] . "<br>";
    echo "Nome do Piloto: " . $piloto['nomePiloto'] . "<br>";
    echo "Número de Voltas Completadas: " . $piloto['voltasCompletadas'] . "<br>";
    echo "Tempo Total de Corrida: " . gmdate("H:i:s", $piloto['tempoTotalCorrida']) . "<br>";
    echo "<br><br>";
}


Valores corretos de "tempo total de prova" para cada piloto (Considere apenas o tempo total de prova, pois o tempo das voltas é informado no log):


F.MASSA (038):

Volta 1: 1:02.852
Volta 2: 1:03.170
Volta 3: 1:02.769
Volta 4: 1:02.787
Tempo Total de Prova: 4:11.578

K.RAIKKONEN (002):

Volta 1: 1:04.108
Volta 2: 1:03.982
Volta 3: 1:03.987
Volta 4: 1:03.076
Tempo Total de Prova: 4:15.153

R.BARRICHELLO (033):

Volta 1: 1:04.352
Volta 2: 1:04.002
Volta 3: 1:03.716
Volta 4: 1:04.010
Tempo Total de Prova: 4:16.080

M.WEBBER (023):

Volta 1: 1:04.414
Volta 2: 1:04.805
Volta 3: 1:04.287
Volta 4: 1:04.216
Tempo Total de Prova: 4:17.722

F.ALONSO (015):

Volta 1: 1:18.456
Volta 2: 1:07.011
Volta 3: 1:08.704
Volta 4: 1:20.050
Tempo Total de Prova: 4:54.221

S.VETTEL (011):

Volta 1: 3:31.315
Volta 2: 1:37.864
Volta 3: 1:18.097
Tempo Total de Prova: 6:27.276 (S.VETTEL não completou a prova - DNF - "Did Not Finish")


Valores que estão sendo retornados: Note que o erro parece ser que a última volta não está sendo somada ao tempo total de prova dos pilotos, mas já tentei de tudo e não vai...


Posição de Chegada: 1
Código do Piloto: 038
Nome do Piloto: F.MASSA
Número de Voltas Completadas: 4
Tempo Total de Corrida: 00:03:09

Posição de Chegada: 2
Código do Piloto: 002
Nome do Piloto: K.RAIKKONEN
Número de Voltas Completadas: 4
Tempo Total de Corrida: 00:03:11

Posição de Chegada: 3
Código do Piloto: 033
Nome do Piloto: R.BARRICHELLO
Número de Voltas Completadas: 4
Tempo Total de Corrida: 00:03:12

Posição de Chegada: 4
Código do Piloto: 023
Nome do Piloto: M.WEBBER
Número de Voltas Completadas: 4
Tempo Total de Corrida: 00:03:13

Posição de Chegada: 5
Código do Piloto: 015
Nome do Piloto: F.ALONSO
Número de Voltas Completadas: 4
Tempo Total de Corrida: 00:03:36

Posição de Chegada: 6
Código do Piloto: 011
Nome do Piloto: S.VETTEL
Número de Voltas Completadas: 3
Tempo Total de Corrida: 00:00:00
Maxuel

Maxuel

Responder

Post mais votado

21/12/2023

O problema parece estar na lógica para calcular o tempo total de corrida para cada piloto. O código tá calculando o tempo total apenas quando o piloto completa a quarta volta, e isso não inclui o tempo da última volta.

Um jeito é calcular o tempo total de corrida após o término da corrida, considerando todos os tempos de volta disponíveis para cada piloto. Vamo bolar uma modificação no código para corrigir esse problema:

<?php

// Abre o arquivo de log
$arquivo = fopen("log.txt", "r") or die("Não foi possível abrir o arquivo!");

// Ignora a primeira linha
fgets($arquivo);

// Inicializa um array para armazenar os resultados da corrida
$resultadosCorrida = [];

// Lê o arquivo linha por linha
while (!feof($arquivo)) {
// Obtém a linha atual
$linha = fgets($arquivo);

// Divide a linha em partes
$partes = explode(" ", $linha);

// Extrai os dados necessários
$codigoPiloto = $partes[1];
$numeroVolta = $partes[2];
$tempoVolta = $partes[3];

// Verifica se o piloto já está nos resultados da corrida
if (!isset($resultadosCorrida[$codigoPiloto])) {
// Analisa corretamente o nome do piloto usando uma expressão regular
preg_match('/\\d+ – (.+?)\\s/', $linha, $correspondencias);
$nomePiloto = $correspondencias[1];

// Obtém apenas o código do piloto
$codigoPiloto = substr($codigoPiloto, 0, 3);

// Inicializa os dados do piloto
$resultadosCorrida[$codigoPiloto] = [
'codigoPiloto' => $codigoPiloto,
'nomePiloto' => $nomePiloto,
'voltasCompletadas' => 0,
'tempoTotalCorrida' => 0,
'temposVolta' => [], // Array para armazenar os tempos de cada volta
];
}

// Atualiza os dados do piloto
$resultadosCorrida[$codigoPiloto]['voltasCompletadas']++;

// Armazena o tempo de cada volta
$tempoVolta = strtotime($partes[0]);
$resultadosCorrida[$codigoPiloto]['temposVolta'][] = $tempoVolta;
}

// Fecha o arquivo
fclose($arquivo);

// Calcula o tempo total de corrida para cada piloto
foreach ($resultadosCorrida as $codigoPiloto => $dadosPiloto) {
$tempoTotal = array_sum($dadosPiloto['temposVolta']);
$resultadosCorrida[$codigoPiloto]['tempoTotalCorrida'] = $tempoTotal;
}

// Ordena os resultados pelo número de voltas completadas e tempo total de corrida
usort($resultadosCorrida, function ($a, $b) {
if ($a['voltasCompletadas'] == $b['voltasCompletadas']) {
return $a['tempoTotalCorrida'] <=> $b['tempoTotalCorrida'];
}
return $b['voltasCompletadas'] <=> $a['voltasCompletadas'];
});

// Imprime os resultados da corrida
foreach ($resultadosCorrida as $posicao => $piloto) {
// Adiciona a posição de chegada
$piloto['posicaoChegada'] = $posicao + 1;

// Exibe os resultados
echo "Posição de Chegada: " . $piloto['posicaoChegada'] . "<br>";
echo "Código do Piloto: " . $piloto['codigoPiloto'] . "<br>";
echo "Nome do Piloto: " . $piloto['nomePiloto'] . "<br>";
echo "Número de Voltas Completadas: " . $piloto['voltasCompletadas'] . "<br>";
echo "Tempo Total de Corrida: " . gmdate("H:i:s", $piloto['tempoTotalCorrida']) . "<br>";
echo "<br><br>";
}
?>



Essa modificação ai vai calcular para você o tempo total de corrida somando todos os tempos de volta para cada piloto, independentemente do número de voltas completadas. Isso ai deve fazer a boa para tu

P3rm4tr1p

P3rm4tr1p
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar