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
Código:
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
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
Curtir tópico
+ 0
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
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
Responder
Clique aqui para fazer login e interagir na Comunidade :)