Program.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. namespace D20._2
  7. {
  8. public class R : StreamReader, IEnumerable
  9. {
  10. public R(Stream stream) : base(stream) { }
  11. public IEnumerator GetEnumerator()
  12. {
  13. while (true)
  14. {
  15. var line = ReadLine();
  16. if (line == null) break;
  17. yield return line;
  18. }
  19. }
  20. }
  21. class Program
  22. {
  23. static void Main(string[] args)
  24. {
  25. var ranges = new List<(uint start, uint end)>();
  26. ParseFile(args, ranges);
  27. ranges.Sort();
  28. ReduceRanges(ranges);
  29. uint count = 0;
  30. for (var i = 1; i < ranges.Count; ++i)
  31. {
  32. var r1 = ranges[i - 1];
  33. var r2 = ranges[i];
  34. count += r2.start - r1.end - 1;
  35. }
  36. Console.WriteLine($"The answer is : {count}");
  37. }
  38. private static void ReduceRanges(List<(uint start, uint end)> ranges)
  39. {
  40. for (var i = 1; i < ranges.Count; ++i)
  41. {
  42. var r1 = ranges[i - 1];
  43. var r2 = ranges[i];
  44. if (r2.start >= r1.start && r2.end <= r1.end)
  45. {
  46. ranges.RemoveAt(i);
  47. i--;
  48. continue;
  49. }
  50. if (r2.start >= r1.start && r2.start <= r1.end + 1 && r2.end > r1.end)
  51. {
  52. ranges[i] = (r1.start, r2.end);
  53. ranges.RemoveAt(i - 1);
  54. i--;
  55. continue;
  56. }
  57. }
  58. }
  59. private static void ParseFile(string[] args, List<(uint start, uint end)> ranges)
  60. {
  61. using (var file = new R(File.OpenText(args[0]).BaseStream))
  62. {
  63. foreach (string line in file)
  64. {
  65. var lr = line.Split("-");
  66. var start = uint.Parse(lr[0]);
  67. var end = uint.Parse(lr[1]);
  68. ranges.Add((start, end));
  69. }
  70. }
  71. }
  72. }
  73. }