Назад к задачам
Middle — Senior
13

Маркировка общих участков нескольких наборов отрезков

Компании, где спрашивали:

ED-IT
Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Имеются три разных набора отрезков. Нужно определить все участки, где они пересекаются, отметить такие пересечения как отдельные новые отрезки (например, пересечение наборов green и yellow отмечаем как новый отрезок – см. exampleResult4), вырезать их из исходных наборов и вывести последовательность получившихся отрезков в диапазоне от 0 до 100.

// Мнемоники отрезков
const Task4 = () => {
    type IMnemo = "green" | "yellow" | "red"
    //Тип для отрезка - начало и конец
    interface IInterval {
        start: number,
        end: number
    }
    type ISourceIntervals = Record<IMnemo, IInterval[]>

    //Тип ответа
    interface IExpectedResult extends IInterval {
        mnemo: IMnemo[],
    }
    //Исходные отрезки
    const sourceData: ISourceIntervals = {
        green: [{ start: 0, end: 30 }, { start: 90, end: 100 }],
        yellow: [{ start: 20, end: 40 }, { start: 50, end: 70 }],
        red: [{ start: 10, end: 50 }, { start: 70, end: 90 }],
    }

    //Ожидаемый результат
    const expectedResult: IExpectedResult[] = [
        { "mnemo": ["green"], start: 0, end: 10 },
        { "mnemo": ["green", "red"], start: 10, end: 20 },
        { "mnemo": ["green", "yellow", "red"], start: 20, end: 30 },
        { "mnemo": ["yellow", "red"], start: 30, end: 40 },
        { "mnemo": ["red"], start: 40, end: 50 },
        { "mnemo": ["yellow"], start: 50, end: 70 },
        { "mnemo": ["red"], start: 70, end: 90 },
        { "mnemo": ["green"], start: 90, end: 100 },
    ]

    // Реализовать внутри этой функции оптимальным способом, перебор исходного массива
    // может быть только один! Допускается формирования дополнительных массивов/объектов
    const getResult = (sourceIntervals: ISourceIntervals): IExpectedResult[] => {
        return expectedResult
    }

    //Это выведет результат её работы справа
    return { expectedResult: expectedResult, result: getResult(sourceData) }
}

//Вспомогательные функции
const showTaskResult =(task: number, taskResult: {result: any, expectedResult: any}) => {
    console.log(`---Результат задачи ${task}---`)
    console.log('Ожидаемый: ', taskResult.expectedResult)
    console.log('Из функции: ', taskResult.result)
    console.log('')
}


showTaskResult(4, Task4())