Всем привет. Недавно увидел задачу, написал небольшое решение. Подскажите, как более правильно её решить?
Дан список отсутствий работников на рабочем месте, например [9,10] - с 9:00 до 10:00
Требуется вывести диапазоны часов, когда все работники были на местах. Рабочий день: 9-18 ч
input:
[
[9, 10],
[15, 17],
[14, 16],
]
output:
[
[10, 14],
[17, 18],
]
Моё решение:
/*
input:
[
[9, 10],
[15, 17],
[14, 16],
]
output:
[
[10, 14],
[17, 18],
]
*/
const input = [
[9, 10], // 10 - 18
[15, 17], // 9 - 15 // 17 - 18
[14, 16], // 9 - 14 // 16 - 18
];
const getWorkTime = (input) => {
const obj = {};
for (let i = 9; i <= 18; i++) {
obj[i] = 0;
}
for (const value of input) {
obj[value[0]] += 1;
obj[value[1]] += 1;
}
let isNegative = false;
let item = [];
const keys = Object.keys(obj);
const output = keys.reduce((accumulator, currentValue, index, array) => {
if (obj[currentValue] === 0) {
isNegative = true;
if (isNegative) {
item.push(currentValue);
}
} else {
isNegative = false;
}
if (!isNegative && item.length) {
accumulator.push(item);
item = [];
}
if (index === keys.length - 1) {
accumulator.push(item);
}
return accumulator;
}, []);
return output.map((currentValue) => {
return [Number(currentValue[0]) - 1, Number(currentValue[output.length]) + 1];
}).map((currentValue) => {
if (!currentValue[1]) {
currentValue[1] = currentValue[0] + 1;
}
return currentValue;
});
}
console.log(getWorkTime(input));