Program.cs 3.1 KB

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