| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- namespace D20._2
- {
- public class R : StreamReader, IEnumerable
- {
- public R(Stream stream) : base(stream) { }
- public IEnumerator GetEnumerator()
- {
- while (true)
- {
- var line = ReadLine();
- if (line == null) break;
- yield return line;
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- var ranges = new List<(uint start, uint end)>();
- ParseFile(args, ranges);
- ranges.Sort();
- ReduceRanges(ranges);
- uint count = 0;
- for (var i = 1; i < ranges.Count; ++i)
- {
- var r1 = ranges[i - 1];
- var r2 = ranges[i];
- count += r2.start - r1.end - 1;
- }
- Console.WriteLine($"The answer is : {count}");
- }
- private static void ReduceRanges(List<(uint start, uint end)> ranges)
- {
- for (var i = 1; i < ranges.Count; ++i)
- {
- var r1 = ranges[i - 1];
- var r2 = ranges[i];
- if (r2.start >= r1.start && r2.end <= r1.end)
- {
- ranges.RemoveAt(i);
- i--;
- continue;
- }
- if (r2.start >= r1.start && r2.start <= r1.end + 1 && r2.end > r1.end)
- {
- ranges[i] = (r1.start, r2.end);
- ranges.RemoveAt(i - 1);
- i--;
- continue;
- }
- }
- }
- private static void ParseFile(string[] args, List<(uint start, uint end)> ranges)
- {
- using (var file = new R(File.OpenText(args[0]).BaseStream))
- {
- foreach (string line in file)
- {
- var lr = line.Split("-");
- var start = uint.Parse(lr[0]);
- var end = uint.Parse(lr[1]);
- ranges.Add((start, end));
- }
- }
- }
- }
- }
|