Яндекс Блиц Фронт 2: Финал #6

Яндекс Блиц Фронт 2: Финал #6


Продолжаем серию задач из конкурса от Яндекса

«Робот для пулл-реквестов»

В компании X есть своя система контроля версий. Эта VCS не умеет анализировать изменения в файлах и может смёржить два реквеста автоматически, если они не содержат изменений в одних и тех же файлах.

В определённый момент запускается робот, который автоматически мёржит в мастер пулл-реквесты. Задача робота — смёржить наибольшее количество изменений, после чего дежурный разработчик собирает текущий мастер в релиз и отдаёт его в тестирование.

Робот принимает на вход список реквестов, отсортированных по времени создания. В данных о каждом реквесте содержится список файлов, которые в нём изменились, и время создания реквеста. В каждом реквесте может быть изменён хотя бы один файл.

Робот должен вернуть массив с идентификаторами реквестов в том порядке, в котором их нужно смёржить. При этом робот должен влить максимум изменений (количество изменённых файлов) без конфликтов в порядке времени создания реквестов.

Напишите код этого робота.

Формат ввода

На вход подаётся массив реквестов. Длина массива - не более 1000, количество конфликутющих между собой пулл-реквестов - не более 20.

У каждого реквеста такая структура:

type PullRequest = { 
    /** 
     * Массив имён изменённых файлов (отсортирован лексикографически) 
     * Длина массива N: 1 <= N <= 1000 
     */ 
    files: string[], 
    /** 
     * Уникальный идентификатор реквеста в VCS 
     */ 
    id: string, 
    /** 
     * Unix-timestamp создания пулл-реквеста 
     */ 
    created: number, 
}

Время создания (created) и идентификатор (id) каждого реквеста – уникальны.

Формат вывода

Код робота должен экспортироваться в виде CommonJS-модуля вида:

/** 
 * @param {PullRequest[]} pullRequests массив PR, отсортированных по времени создания 
 * @returns {string[]} идентификаторы реквестов в порядке мёржа 
 */ 
module.exports = function (pullRequests) { 
    // ваш код 
}

Примечания

Ваше решение будет тестироваться в NodeJS версии v9.11.2.

Оно не должно использовать внешних зависимостей.

Примеры входных и выходных данных

function mergeAllPRs(prs) { /* solution */ } 
console.assert( 
    mergeAllPRs([ 
        { 
            id: ’#1’, 
            created: 1536077100, 
            files: [’.gitignore’, ’README.md’] 
        }, 
        { 
            id: ’#2’, 
            created: 1536077700, 
            files: [’index.js’, ’package-lock.json’, ’package.json’] 
        }, 
        { 
            id: ’#3’, 
            created: 1536077800, 
            files: [’.pnp.js’, ’yarn.lock’] 
        } 
    ]) 
    .join(’,’) === [ 
        "#1", 
        "#2", 
        "#3" 
    ].join(’,’) 
); 
console.assert( 
    mergeAllPRs([ 
        { 
            id: ’#1’, 
            created: 1536074100, 
            files: [’README.md’] 
        }, 
        { 
            id: ’#2’, 
            created: 1536078700, 
            files: [’README.md’] 
        }, 
        { 
            id: ’#3’, 
            created: 1536097800, 
            files: [’README.md’] 
        } 
    ]).join(’,’) === [ 
        "#1" 
    ].join(’,’) 
); 
console.assert( 
    mergeAllPRs([ 
        { 
            id: ’#1’, 
            created: 1536077100, 
            files: [’.gitignore’, ’README.md’] 
        }, 
        { 
            id: ’#2’, 
            created: 1536077700, 
            files: [’index.js’, ’package-lock.json’, ’package.json’] 
        }, 
        { 
            id: ’#3’, 
            created: 1536077800, 
            files: [’.pnp.js’, ’package-lock.json’, ’yarn.lock’] 
        }, 
        { 
            id: ’#4’, 
            created: 1536077900, 
            files: [’index.spec.js’, ’index.spec.ts’, ’index.ts’] 
        } 
    ]) 
    .join(’,’) === [ 
        "#1", 
        "#2", 
        "#4" 
    ].join(’,’) 
);




Report Page