Program.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text.RegularExpressions;
  5. namespace D14._2
  6. {
  7. public enum EnumState
  8. {
  9. Running, Resting
  10. };
  11. public class Reindeer
  12. {
  13. public int Speed;
  14. public int SpeedTime;
  15. public int RestTime;
  16. public string Name;
  17. public int Points = 0;
  18. public int DistanceTraveled = 0;
  19. public EnumState State = EnumState.Running;
  20. public int Remaining = 0;
  21. public override bool Equals(object obj)
  22. {
  23. var reindeer = obj as Reindeer;
  24. return reindeer != null &&
  25. Name == reindeer.Name;
  26. }
  27. public override int GetHashCode()
  28. {
  29. return HashCode.Combine(Name);
  30. }
  31. }
  32. class Program
  33. {
  34. static void Main(string[] args)
  35. {
  36. if (args.Length < 1) throw new ArgumentException();
  37. if (File.Exists(args[0]) == false) throw new FileNotFoundException();
  38. var reindeers = new HashSet<Reindeer>();
  39. ParseFile(args[0], reindeers);
  40. for (int second = 0; second <= 2503; ++second)
  41. {
  42. int maxDistance = 0;
  43. foreach (var r in reindeers)
  44. {
  45. if (r.State == EnumState.Running)
  46. {
  47. r.DistanceTraveled += r.Speed;
  48. r.Remaining--;
  49. if (r.Remaining == 0)
  50. {
  51. r.Remaining = r.RestTime;
  52. r.State = EnumState.Resting;
  53. }
  54. }
  55. else
  56. {
  57. r.Remaining--;
  58. if (r.Remaining == 0)
  59. {
  60. r.Remaining = r.SpeedTime;
  61. r.State = EnumState.Running;
  62. }
  63. }
  64. if (r.DistanceTraveled > maxDistance) maxDistance = r.DistanceTraveled;
  65. }
  66. foreach (var r in reindeers)
  67. if (r.DistanceTraveled == maxDistance) r.Points++;
  68. }
  69. int maxPoints = 0;
  70. foreach (var r in reindeers)
  71. if (r.Points > maxPoints) maxPoints = r.Points;
  72. Console.WriteLine($"The answer is : {maxPoints}");
  73. }
  74. private static void ParseFile(string f, HashSet<Reindeer> reindeers)
  75. {
  76. var regex = new Regex(@"(?<n>\w+) can fly (?<s>\d+) km/s for (?<st>\d+) seconds, but then must rest for (?<rt>\d+) seconds.");
  77. using (var file = File.OpenText(f))
  78. {
  79. while (true)
  80. {
  81. var line = file.ReadLine();
  82. if (line == null) break;
  83. var result = regex.Match(line);
  84. var r = new Reindeer();
  85. r.Name = result.Groups["n"].Value;
  86. r.Speed = int.Parse(result.Groups["s"].Value);
  87. r.SpeedTime = int.Parse(result.Groups["st"].Value);
  88. r.RestTime = int.Parse(result.Groups["rt"].Value);
  89. r.Remaining = r.SpeedTime;
  90. reindeers.Add(r);
  91. }
  92. }
  93. }
  94. }
  95. }