JSFiddle - React, Tailwind, and code Playground
by Pavel Kityan
JavaScript
var a = [
[1, 3.33],
[2, 3.5],
[4.1, 7],
[2, 5],
[10, 15]
];
var sets = createSets(a);
var max = getMax(sets);
console.log('Max length =', max.length, 'and line is', sets[max.index]);
///
function createSets(lines) {
var sets = []
for (var j = 0, qty = lines.length; j < qty; j++) {
var line = lines[j];
if (!sets.length) {
sets.push(line);
continue;
}
var cntr = 0;
var indexesToCombine = [];
for (var i = 0, qty2 = sets.length; i < qty2; i++) {
if (check(sets[i], line)) {
cntr++;
combineSetWithLine(sets, i, line);
indexesToCombine.push(i);
}
}
if (cntr == sets.length) {
sets = combineSets(sets, indexesToCombine);
} else {
sets.push(line);
}
}
return sets;
}
function check(where, what) {
return (
(what[0] >= where[0] && what[0] <= where[1]) || // левая точка внутри
(what[1] >= where[0] && what[1] <= where[1]) || // права точка внутри
(what[0] < where[0] && what[1] > where[1]) // точки по разные стороны
)
}
function combineSetWithLine(sets, i, line) {
sets[i][0] = (sets[i][0] > line[0]) ? line[0] : sets[i][0];
sets[i][1] = (sets[i][1] < line[1]) ? line[1] : sets[i][1];
}
function combineSets(_sets, indexesToCombine) {
if (_sets.length == 1) {
return _sets;
}
var sets = [];
var combined = [];
for (var i = 0, qty = _sets.length; i < qty; i++) {
if (indexesToCombine.indexOf(i) < 0) {
sets.push(_sets[i]);
} else {
combined[0] = (combined[0] === undefined || combined[0] > _sets[i][0]) ? _sets[i][0] : combined[0];
combined[1] = (combined[1] === undefined || combined[1] < _sets[i][1]) ? _sets[i][1] : combined[1];
}
}
sets.push(combined);
return sets;
}
function getMax(sets) {
var lengthes = sets.map(function(el) {
return el[1] - el[0];
})
var max = {
length: lengthes[0],
index: 0
}
if (lengthes.length == 1) {
return max;
}
for (var j = 1; j <...