interface IRange { min: number, max: number }
const range = (min:number, max: number) => ({min, max});
function findGaps(parent: IRange, children: IRange[]): IRange[] {
children.sort((a, b) => a.min - b.min); // sort for deduce range values
let currentMin = parent.min; // absolute minimum
return children.reduce((gaps, curr, index, arr) => {
const min = Math.max(currentMin, parent.min);
const max = Math.min(curr.min, parent.max);
if (max > min) {
gaps.push(range(min, max));
}
currentMin = curr.max;
if (index + 1 == arr.length && currentMin < parent.max) {
gaps.push(range(currentMin + 1, parent.max));
}
return gaps;
}, []);
}
const gaps = findGaps(
range(0, 10), [
range(2,4),
range(6,9)
]);
console.log("gaps", gaps);
// 0: {min: 0, max: 2}
// 1: {min: 4, max: 6}
// 2: {min: 10, max: 10}
C# (Integer) version
void Main()
{
var parent = GapsHelper.GetRange(0, 50);
var children = new List<IRange>() {
GapsHelper.GetRange(5, 9),
GapsHelper.GetRange(11, 15),
GapsHelper.GetRange(15, 30),
GapsHelper.GetRange(32, 40),
};
var gaps2 = GapsHelper.FindGaps(parent, children);
Console.WriteLine(gaps2);
/*
0 - 4
10 - 10
31 - 31
41 - 50
*/
}
public interface IRange
{
int Min { get; set; }
int Max { get; set; }
}
public class Range : IRange
{
public int Min { get; set; }
public int Max { get; set; }
}
public class GapsHelper
{
public static IRange GetRange(int min, int max) => new Range { Min = min, Max = max };
public static IEnumerable<IRange> FindGaps(IRange parent, List<IRange> children)
{
children.Sort((a, b) => a.Min - b.Min); // sort for deduce range values
var currentMin = parent.Min - 1; // absolute minimum
var index = 0;
return children.Aggregate(new List<IRange>(), (gaps, curr) => // List<IRange> , Range
{
index++;
var min = Math.Max(currentMin + 1, parent.Min);
var max = Math.Min(curr.Min - 1, parent.Max);
if (max >= min)
gaps.Add(GetRange(min, max));
currentMin = curr.Max;
if (index == children.Count && currentMin < parent.Max)
gaps.Add(GetRange(currentMin + 1, parent.Max));
return gaps;
});
}
}
222200cookie-checkTypescript calculate gaps in ranges