Exemplo n.º 1
0
        static void Main(string[] args)
        {
            string nullOrEmptyToExitApp = "_";

            while (!string.IsNullOrEmpty(nullOrEmptyToExitApp))
            {
                try
                {
                    var voltas = new HashSet <Volta>();
                    Console.WriteLine("Cole aqui o endereço do log:");
                    var caminho = Console.ReadLine();

                    if (!File.Exists(caminho))
                    {
                        throw new DirectoryNotFoundException(caminho);
                    }

                    foreach (var linha in File.ReadAllLines(caminho).Skip(1))
                    {
                        voltas.Add(Util.ConvertToVolta(Util.SplitLog(linha)));
                    }

                    var results = voltas
                                  .GroupBy(c => c.piloto)
                                  .Select(r =>
                                          new KeyValuePair <int, ResultadoCorrida>(
                                              r.Key.numero,
                                              new ResultadoCorrida()
                    {
                        posicaoChegada = null,
                        codigoPiloto   = r.Key.numero,
                        nomePiloto     = r.Key.nome,
                        quantidadeVoltasCompletadas = r.Count(),
                        tempoTotalProva             = new TimeSpan(r.Sum(v => v.tempoVolta.Ticks)),

                        completouCorrida = r.Max(v => v.numeroVolta) == 4,

                        melhorVolta              = new TimeSpan(r.Min(v => v.tempoVolta.Ticks)),
                        velocidadeMediaCorrida   = new TimeSpan(r.Sum(v => v.velocidadeMediaVolta.Ticks) / r.Count()),
                        tempoChegadaAposVencedor = null
                    }
                                              )
                                          ).ToDictionary(i => i.Key, i => i.Value);

                    Console.WriteLine("P - COD -  Nome Piloto  - V -   Tempo Total    -    Tempo Após    -    Vel Média     - Melhor volta");

                    int  posicao = 1;
                    long tempoChegadaAnterior = 0;
                    int  paddingNumeroPiloto  = 3;
                    int  paddingNomePiloto    = results.Values.Max(v => v.nomePiloto.Length);

                    foreach (var result in results.Values.OrderBy(v => v.tempoTotalProva))
                    {
                        if (result.completouCorrida)
                        {
                            result.tempoChegadaAposVencedor = new TimeSpan(tempoChegadaAnterior != 0 ? result.tempoTotalProva.Ticks - tempoChegadaAnterior : 0);
                            tempoChegadaAnterior            = result.tempoTotalProva.Ticks;
                            result.posicaoChegada           = posicao;
                            Console.Write(result.posicaoChegada);
                            Console.Write(" - ");
                            Console.Write(result.codigoPiloto.ToString().PadLeft(paddingNumeroPiloto));
                            Console.Write(" - ");
                            Console.Write(result.nomePiloto.PadRight(paddingNomePiloto));
                            Console.Write(" - ");
                            Console.Write(result.quantidadeVoltasCompletadas);
                            Console.Write(" - ");
                            Console.Write(result.tempoTotalProva);
                            Console.Write(" - ");
                            Console.Write(result.posicaoChegada != 1 ? result.tempoChegadaAposVencedor.Value.ToString() : string.Empty.PadRight(16));
                            Console.Write(" - ");
                            Console.Write(result.velocidadeMediaCorrida);
                            Console.Write(" - ");
                            Console.Write(result.melhorVolta);
                            Console.WriteLine();
                            posicao++;
                        }
                    }

                    Console.WriteLine($"Melhor volta da corrida: {results.Values.Min(v => v.melhorVolta)}");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine();
                    Console.WriteLine(e);
                }

                nullOrEmptyToExitApp = Console.ReadLine();
            }
        }