Advertisement
social1986

Untitled

Mar 15th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.43 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. public class RaceTower
  7. {
  8.     private List<Driver> drivers;
  9.     private Queue<Driver> lostDrivers;
  10.  
  11.     public RaceTower()
  12.     {
  13.         this.drivers = new List<Driver>();
  14.         this.lostDrivers = new Queue<Driver>();
  15.     }
  16.  
  17.     public int TotalLaps { get; private set; }
  18.     public int TrackLength { get; private set; }
  19.     public int CurrentLap { get; private set; }
  20.     private string Weather { get; set; }
  21.     public IReadOnlyCollection<Driver> Drivers => (IReadOnlyCollection<Driver>)this.drivers;
  22.  
  23.     public void SetTrackInfo(int totalLaps, int trackLength)
  24.     {
  25.         this.TotalLaps = totalLaps;
  26.         this.TrackLength = trackLength;
  27.         this.CurrentLap = 0;
  28.     }
  29.  
  30.     public void PrintWinner()
  31.     {
  32.         var winner = drivers.OrderBy(d => d.TotalTime).First();
  33.         Console.WriteLine($"{winner.Name} wins the race for {winner.TotalTime:f3} seconds.");
  34.     }
  35.  
  36.     public void RegisterDriver(List<string> commandArgs)
  37.     {
  38.         var driverInfo = commandArgs.Take(2).ToList();
  39.        
  40.         var carInfo = commandArgs.Skip(2).ToList();
  41.         var tyreInfo = commandArgs.Skip(4).ToList();
  42.         var tyre = TyreFactory.CreateTyre(tyreInfo);
  43.         var car = CarFactory.CreateCar(carInfo, tyre);
  44.         var driver = DriverFactory.CreateDriver(driverInfo, car);
  45.         drivers.Add(driver);
  46.     }
  47.  
  48.     public void DriverBoxes(List<string> commandArgs)
  49.     {
  50.         var type = commandArgs[0];
  51.         var driversName = commandArgs[1];
  52.         var currentDriver = drivers.FirstOrDefault(d => d.Name == driversName);
  53.         currentDriver.TotalTime += 20;
  54.  
  55.         switch (type)
  56.         {
  57.             case "ChangeTyres":
  58.                 var tyreInfo = commandArgs.Skip(2).ToList();
  59.                 var tyre = TyreFactory.CreateTyre(tyreInfo);
  60.                 currentDriver.Car.ChangeTyre(tyre);
  61.                 break;
  62.             case "Refuel":
  63.                 var fuelAmount = double.Parse(commandArgs[2]);
  64.                 currentDriver.Car.Refuel(fuelAmount);
  65.                 break;
  66.         }
  67.     }
  68.  
  69.     public string CompleteLaps(List<string> commandArgs)
  70.     {
  71.         var sb = new StringBuilder();
  72.  
  73.         var numberOfLaps = int.Parse(commandArgs[0]);
  74.  
  75.         if (numberOfLaps + CurrentLap > TotalLaps)
  76.         {
  77.             return $"There is no time! On lap {CurrentLap}.";
  78.         }
  79.  
  80.         for (int lap = 0; lap < numberOfLaps; lap++)
  81.         {
  82.             for (int count = 0; count < drivers.Count; count++)
  83.             {
  84.                 var currentDriver = drivers[count];
  85.                 currentDriver.AddTimeToTotalTime(this.TrackLength);
  86.  
  87.                 try
  88.                 {
  89.                     currentDriver.Car.ReduceFuel(this.TrackLength, currentDriver.FuelConsumptionPerKm);
  90.                     currentDriver.Car.Tyre.DegradateTyre();
  91.                 }
  92.                 catch (ArgumentException ex)
  93.                 {
  94.                     currentDriver.FailureReason = ex.Message;
  95.                     RemoveFailedDruiver(currentDriver, drivers, lostDrivers);
  96.                     count--;
  97.                 }
  98.             }
  99.             this.CurrentLap++;
  100.             CheckForOvertaking(drivers, sb);
  101.         }
  102.  
  103.         return sb.ToString(); ;
  104.     }
  105.  
  106.     private void CheckForOvertaking(List<Driver> drivers, StringBuilder sb)
  107.     {
  108.         drivers = drivers.OrderByDescending(d => d.TotalTime).ToList();
  109.  
  110.         for (int count = 0; count < drivers.Count - 1; count++)
  111.         {
  112.             var firstDriver = drivers[count];
  113.             var secondDriver = drivers[count + 1];
  114.  
  115.             var timeDifference = Math.Abs(firstDriver.TotalTime - secondDriver.TotalTime);
  116.  
  117.             if (firstDriver.GetType().Name == "AggressiveDriver" && firstDriver.Car.Tyre.Name == "Ultrasoft" && timeDifference <= 3)
  118.             {
  119.                 if (this.Weather == "Foggy")
  120.                 {
  121.                     firstDriver.FailureReason = "Crashed";
  122.                     RemoveFailedDruiver(firstDriver, drivers, lostDrivers);
  123.                 }
  124.                 else
  125.                 {
  126.                     ChangeDriversPositions(firstDriver, secondDriver, 3);
  127.                     sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
  128.                     count++;
  129.                 }
  130.             }
  131.             else if (firstDriver.GetType().Name == "EnduranceDriver" && firstDriver.Car.Tyre.Name == "Hard" && timeDifference <= 3)
  132.             {
  133.                 if (this.Weather == "Rainy")
  134.                 {
  135.                     firstDriver.FailureReason = "Crashed";
  136.                     RemoveFailedDruiver(firstDriver, drivers, lostDrivers);
  137.                 }
  138.                 else
  139.                 {
  140.                     ChangeDriversPositions(firstDriver, secondDriver, 3);
  141.                     sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
  142.                 }
  143.             }
  144.             else if (timeDifference <= 2)
  145.             {
  146.                 ChangeDriversPositions(firstDriver, secondDriver, 2);
  147.                 sb.Append(ReturningOvertakingInfo(firstDriver, secondDriver));
  148.             }
  149.         }
  150.     }
  151.  
  152.     private string ReturningOvertakingInfo(Driver firstDriver, Driver secondDriver)
  153.     {
  154.         return $"{firstDriver.Name} has overtaken {secondDriver.Name} on lap {this.CurrentLap}.";
  155.     }
  156.  
  157.     private void ChangeDriversPositions(Driver firstDriver, Driver secondDriver, int time)
  158.     {
  159.         firstDriver.TotalTime -= time;
  160.         secondDriver.TotalTime += time;
  161.     }
  162.  
  163.     private void RemoveFailedDruiver(Driver driver, List<Driver> drivers, Queue<Driver> lostDrivers)
  164.     {
  165.         lostDrivers.Enqueue(driver);
  166.         this.drivers.Remove(driver);
  167.     }
  168.  
  169.     public string GetLeaderboard()
  170.     {
  171.         var counter = 1;
  172.         var sb = new StringBuilder();
  173.         sb.AppendLine($"Lap {this.CurrentLap}/{this.TotalLaps}");
  174.  
  175.         foreach (var driver in drivers.OrderBy(d => d.TotalTime))
  176.         {
  177.             sb.AppendLine($"{counter++} {driver.Name} {driver.TotalTime:f3}");
  178.         }
  179.  
  180.         foreach (var driver in lostDrivers.Reverse())
  181.         {
  182.             sb.AppendLine($"{counter++} {driver.Name} {driver.FailureReason}");
  183.         }
  184.         return sb.ToString().TrimEnd();
  185.     }
  186.  
  187.     public void ChangeWeather(List<string> commandArgs)
  188.     {
  189.         var newWeather = commandArgs[0];
  190.         this.Weather = newWeather;
  191.     }
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement