Олимпиадная задача: Последний общий коммит веток git

Не могу решить данную задачу, так как честно говоря по картинке совсем не понимаю как устроены эти ветки. Пользуюсь другим GUI и то что я вижу здесь не могу воспринять совсем.

Сама задача:

Необходимо написать функцию, которая на вход получает информацию о коммитах и массив из двух имён веток, а на выход отдаёт сообщение их последнего общего коммита.

Структура коммита:

// ? - необязательные поля (могут отсутствовать в объекте)
interface Commit {
    id: string; // уникальный идентификатор коммита
    timestamp: number; // время создания в миллисекундах
    parents?: string[]; // массив id родительских коммитов
    message?: string; // сообщение коммита
    branches?: string[]; // массив имён веток
}

Все коммиты имеют уникальные id, все id родительских коммитов соответствуют коммитам в массиве. В целом, считаем, что входные данные корректны и дополнительная их проверка не требуется.

Шаблоны

function getLastCommonCommitMessage(commits, branches) {
    // code here
};

module.exports = {getLastCommonCommitMessage};

Иллюстрация

Для данного репозитория и веток ['D', 'E'] последний общий коммит f434df35 содержит сообщение add title. Хотя для этих двух веток коммиты 35b7ad0c и ca115bed также являются общими, но последний по времени именно f434df35.

введите сюда описание изображения Примеры:

getLastCommonCommitMessage([
{
  id: '1',
  message: 'initial commit',
  timestamp: 1624010073113,
},
{
  id: '2',
  parents: ['1'],
  message: 'add layout',
  timestamp: 1624010082219,
},
{
  id: '3',
  parents: ['2'],
  message: 'fix bugs',
  timestamp: 1624010109039,
  branches: ['master', 'bugfix']
},
{
  id: '4',
  parents: ['2'],
  message: 'add link',
  timestamp: 1624010179662,
  branches: ['feature/link']
}
], ['bugfix', 'feature/link']) // 'add layout'
getLastCommonCommitMessage([{
  id: '1',
  message: 'initial commit',
  timestamp: 1624010073113,
  branches: ['master'],
}], ['master', 'master']) // 'initial commit'
getLastCommonCommitMessage([], ['ghost', 'bla-bla-bla-branch']) // Error('No common commit')

Требования:

Найденный коммит должен быть последним по времени (если общих коммитов больше одного), то есть самым поздним. У всех коммитов гарантированно разное время;

Массив id для родительских коммитов не упорядочен по времени их создания;

При отсутствии поля message у коммита вернуть пустую строку '';

При отсутствии общего коммита выбросить ошибку c message 'No common commit';


Ответы (0 шт):