Middle — Senior
Маркировка общих участков нескольких наборов отрезков
livecode
Условие задачи
Имеются три разных набора отрезков. Нужно определить все участки, где они пересекаются, отметить такие пересечения как отдельные новые отрезки (например, пересечение наборов 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())