Guest User

Untitled

a guest
Jul 21st, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. var sequences = new List<Tuple<int, int>>
  2. {
  3. new Tuple<int, int>(1, 10),
  4. new Tuple<int, int>(8, 101),
  5. new Tuple<int, int>(102, 103),
  6. new Tuple<int, int>(104, 104),
  7. new Tuple<int, int>(110, 200)
  8. };
  9.  
  10. var missing =
  11. Enumerable.Range(1, 200)
  12. .Where(i => sequences.All(t => t.Item1 > i || t.Item2 < i));
  13. var overlapping =
  14. Enumerable.Range(1, 200)
  15. .Where(i => sequences.Count(t => t.Item1 <= i && t.Item2 >= i) > 1);
  16.  
  17. int comparer( Tuple a, Tuple b) {
  18. if ( a.first.compareTo(b.first) == 0 ) {
  19. return a.second.compareTo(b.second);
  20. } else
  21. return a.first.compareTo(b.first);
  22. }
  23.  
  24. Tuple result = SortedList[0];
  25. foreach ( Tuple tuple in SortedList ) {
  26.  
  27. if ( result.second < tuple.first ) {
  28.  
  29. // here you have missing number (result.second, tuple.first)
  30.  
  31. result.first = tuple.first;
  32. result.second = tuple.second
  33. } else if ( result.second > tuple.first ) {
  34.  
  35. // here you have overlapping number (tuple.first, min( result.second,tuple.second ))
  36.  
  37. if ( result.second < tuple.second ) {
  38. result.second = tuple.second;
  39. }
  40. } else {
  41. result.second = tuple.second;
  42. }
  43.  
  44. }
  45.  
  46. var expandedSequences = sequences.Select(t => Enumerable.Range(t.Item1, t.Item2-t.Item1)).SelectMany(t => t).OrderBy(i => i);
  47. var dupes = expandedSequences.GroupBy(i => i).Where(g => g.Count() > 1).Select(g => g.Key);
  48. var missing = Enumerable.Range(expandedSequences.Min(), expandedSequences.Max()).Except(expandedSequences);
  49.  
  50. var sequences = new List<Tuple<int, int>>
  51. {
  52. new Tuple<int, int>(1, 10),
  53. new Tuple<int, int>(8, 101),
  54. new Tuple<int, int>(102, 103),
  55. new Tuple<int, int>(104, 104),
  56. new Tuple<int, int>(110, 200)
  57. };
  58. var missing = new List<int>();
  59. var overlap = new List<int>();
  60.  
  61. sequences.Aggregate((prev, current) => {
  62. if (prev.Item2 >= current.Item1) {
  63. overlap.AddRange(Enumerable.Range(current.Item1, prev.Item2 - current.Item1 + 1));
  64. }
  65. if (current.Item1 > prev.Item2 + 1) {
  66. missing.AddRange(Enumerable.Range(prev.Item2 + 1, current.Item1 - prev.Item2 - 1));
  67. }
  68. return current;
  69. });
  70.  
  71. //Assumes they are sorted on item1
  72. Tuple<IEnumerable<Tuple<int,int>>,IEnumerable<Tuple<int,int>>> FindMissingAndOverLapping(IEnumerable<Tuple<int,int>> sequences){
  73. var previous = Tuple.Create(0, 0);
  74. var missing = new List<Tuple<int,int>>();
  75. var overlapping = new List<Tuple<int, int>>();
  76. var max = 0;
  77. foreach (var sequence in sequences){
  78. var end = previous.Item2;
  79. max = end > max ? end : max;
  80. if (previous.Item2 < sequence.Item1 + 1){
  81. missing.Add(Tuple.Create(previous.Item2 + 1, sequence.Item1 - 1));
  82. } else if (max < sequence.Item1){
  83. overlapping.Add(Tuple.Create(sequence.Item1, max));
  84. }
  85. }
  86. //The sequences in ovrelapping can be ovrelapping them self
  87. return new Tuple<IEnumerable<Tuple<int,int>>,IEnumerable<Tuple<int,int>>>(missing, overlapping);
  88. }
Add Comment
Please, Sign In to add comment