Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var sequences = new List<Tuple<int, int>>
- {
- new Tuple<int, int>(1, 10),
- new Tuple<int, int>(8, 101),
- new Tuple<int, int>(102, 103),
- new Tuple<int, int>(104, 104),
- new Tuple<int, int>(110, 200)
- };
- var missing =
- Enumerable.Range(1, 200)
- .Where(i => sequences.All(t => t.Item1 > i || t.Item2 < i));
- var overlapping =
- Enumerable.Range(1, 200)
- .Where(i => sequences.Count(t => t.Item1 <= i && t.Item2 >= i) > 1);
- int comparer( Tuple a, Tuple b) {
- if ( a.first.compareTo(b.first) == 0 ) {
- return a.second.compareTo(b.second);
- } else
- return a.first.compareTo(b.first);
- }
- Tuple result = SortedList[0];
- foreach ( Tuple tuple in SortedList ) {
- if ( result.second < tuple.first ) {
- // here you have missing number (result.second, tuple.first)
- result.first = tuple.first;
- result.second = tuple.second
- } else if ( result.second > tuple.first ) {
- // here you have overlapping number (tuple.first, min( result.second,tuple.second ))
- if ( result.second < tuple.second ) {
- result.second = tuple.second;
- }
- } else {
- result.second = tuple.second;
- }
- }
- var expandedSequences = sequences.Select(t => Enumerable.Range(t.Item1, t.Item2-t.Item1)).SelectMany(t => t).OrderBy(i => i);
- var dupes = expandedSequences.GroupBy(i => i).Where(g => g.Count() > 1).Select(g => g.Key);
- var missing = Enumerable.Range(expandedSequences.Min(), expandedSequences.Max()).Except(expandedSequences);
- var sequences = new List<Tuple<int, int>>
- {
- new Tuple<int, int>(1, 10),
- new Tuple<int, int>(8, 101),
- new Tuple<int, int>(102, 103),
- new Tuple<int, int>(104, 104),
- new Tuple<int, int>(110, 200)
- };
- var missing = new List<int>();
- var overlap = new List<int>();
- sequences.Aggregate((prev, current) => {
- if (prev.Item2 >= current.Item1) {
- overlap.AddRange(Enumerable.Range(current.Item1, prev.Item2 - current.Item1 + 1));
- }
- if (current.Item1 > prev.Item2 + 1) {
- missing.AddRange(Enumerable.Range(prev.Item2 + 1, current.Item1 - prev.Item2 - 1));
- }
- return current;
- });
- //Assumes they are sorted on item1
- Tuple<IEnumerable<Tuple<int,int>>,IEnumerable<Tuple<int,int>>> FindMissingAndOverLapping(IEnumerable<Tuple<int,int>> sequences){
- var previous = Tuple.Create(0, 0);
- var missing = new List<Tuple<int,int>>();
- var overlapping = new List<Tuple<int, int>>();
- var max = 0;
- foreach (var sequence in sequences){
- var end = previous.Item2;
- max = end > max ? end : max;
- if (previous.Item2 < sequence.Item1 + 1){
- missing.Add(Tuple.Create(previous.Item2 + 1, sequence.Item1 - 1));
- } else if (max < sequence.Item1){
- overlapping.Add(Tuple.Create(sequence.Item1, max));
- }
- }
- //The sequences in ovrelapping can be ovrelapping them self
- return new Tuple<IEnumerable<Tuple<int,int>>,IEnumerable<Tuple<int,int>>>(missing, overlapping);
- }
Add Comment
Please, Sign In to add comment