public void Run(string[] args) { IReader reader; if (args.Length > 0) { reader = new FileReader(args[0]); } else { reader = new ConsoleReader(); } List <RainDeer> raindeers = new List <RainDeer>(); //int time = int.Parse(reader.ReadLine()); int time = 2503; while (!reader.EndOfStream) { var input = reader.ReadLine(); if (string.IsNullOrEmpty(input)) { break; } var split = input.Split(' '); var deer = new RainDeer() { Name = split[0], Speed = int.Parse(split[3]), RaceTime = int.Parse(split[6]), RestTime = int.Parse(split[13]) }; raindeers.Add(deer); } long maxDistance = 0; string winner = string.Empty; foreach (var deer in raindeers) { var distance = CalculateDistance(deer, time); if (distance > maxDistance) { maxDistance = distance; winner = deer.Name; } WriteLine($"{deer.Name} traveled {distance} km."); } WriteLine(); WriteLine($"Winner: {winner} with {maxDistance} km."); }
public void Day14Part2() { var rainDeers = new RainDeer[] { new RainDeer("Comet", 14, 10, 127), new RainDeer("Dancer", 16, 11, 162) }.ToList(); Day14.Race(rainDeers, 1000); Assert.AreEqual(689, rainDeers[1].Points); Assert.AreEqual(312, rainDeers[0].Points); }
public void Day14Part1() { var comet = new RainDeer("Comet", 14, 10, 127); comet.TravelForSeconds(1000); Assert.AreEqual(1120, comet.TotalDistance); var dancer = new RainDeer("Dancer", 16, 11, 162); dancer.TravelForSeconds(1000); Assert.AreEqual(1056, dancer.TotalDistance); }
long CalculateDistance(RainDeer deer, int time) { long totalDistance = 0; while (time > 0) { var timeToRace = time < deer.RaceTime ? time : deer.RaceTime; totalDistance += deer.Speed * timeToRace; time -= timeToRace; time -= deer.RestTime; } return(totalDistance); }
public void Run(string[] args) { IReader reader; if (args.Length > 0) { reader = new FileReader(args[0]); } else { reader = new ConsoleReader(); } List <RainDeer> raindeers = new List <RainDeer>(); //int time = int.Parse(reader.ReadLine()); int time = 2503; while (!reader.EndOfStream) { var input = reader.ReadLine(); if (string.IsNullOrEmpty(input)) { break; } var split = input.Split(' '); var deer = new RainDeer() { Name = split[0], Speed = int.Parse(split[3]), RaceTime = int.Parse(split[6]), RestTime = int.Parse(split[13]) }; raindeers.Add(deer); } for (int i = 0; i < time; i++) { foreach (var deer in raindeers) { if (deer.Statistics.CurrentRaceTime >= deer.RaceTime) { deer.Statistics.CurrentRestTime++; if (deer.Statistics.CurrentRestTime >= deer.RestTime) { deer.Statistics.CurrentRaceTime = 0; deer.Statistics.CurrentRestTime = 0; } } else { deer.Statistics.CurrentRaceTime++; deer.Statistics.TotalDistance += deer.Speed; } } var ordered = raindeers.OrderByDescending(x => x.Statistics.TotalDistance); var max = ordered.First().Statistics.TotalDistance; foreach (var deer in ordered) { if (deer.Statistics.TotalDistance == max) { deer.Statistics.Score++; } else { break; } } } var raceResult = raindeers.OrderByDescending(x => x.Statistics.Score); foreach (var deer in raceResult) { WriteLine($"{deer.Name} scored {deer.Statistics.Score}."); } }