fork(1) download
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4.  
  5. public class Test
  6. {
  7. class Range
  8. {
  9. public int? Start { get; set; }
  10. public int? End { get; set; }
  11. }
  12.  
  13. private static IEnumerable<Range> getAdjacentRanges(IEnumerable<int> nums)
  14. {
  15. var ranges = new List<Range>();
  16. if (!nums.Any())
  17. return ranges;
  18.  
  19. var ordered = nums.OrderBy(i => i);
  20. int lowest = ordered.First();
  21. ranges.Add(new Range { Start = lowest });
  22. int last = lowest;
  23. Range lastRange = null;
  24.  
  25. foreach (int current in ordered)
  26. {
  27. lastRange = ranges[ranges.Count - 1];
  28. if (current > last + 1)
  29. {
  30. lastRange.End = last;
  31. ranges.Add(new Range { Start = current });
  32. }
  33. last = current;
  34. }
  35.  
  36. return ranges;
  37. }
  38.  
  39. public static void Main()
  40. {
  41. var arr = new[] { 1, 2, 3, 4, 8, 9, 10, 15 };
  42. var ranges = getAdjacentRanges(arr)
  43. .Select(r => r.End.HasValue ? string.Format("{0}-{1}", r.Start, r.End) : r.Start.ToString());
  44. Console.Write(string.Join(",",ranges.ToArray()));
  45. }
  46. }
Success #stdin #stdout 0.05s 38152KB
stdin
Standard input is empty
stdout
1-4,8-10,15