Показать сообщение отдельно
  #1 (permalink)  
Старый 19.07.2021, 16:31
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

Как правильно решить задачу про диапазоны часов?
Всем привет. Недавно увидел задачу, написал небольшое решение. Подскажите, как более правильно её решить?
Дан список отсутствий работников на рабочем месте, например [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));

Последний раз редактировалось dc65k, 19.07.2021 в 16:34.
Ответить с цитированием