Собесов

Frontend Яндекса — Граффити: имитация GitHub heatmap пустыми коммитами

АлгоритмыСкрипты и GitСредняяMiddle

Условие

Написать скрипт solution.js, который читает JSON-массив HEX-цветов и создаёт пустые коммиты в текущем git-репозитории так, чтобы GitHub/GitLab contribution graph (heatmap) отобразил указанный паттерн.

node solution.js test.json

Формат test.json

Массив цветов — каждый соответствует одной ячейке heatmap (одному дню), идущих в row-major порядке:

Цвет Уровень Коммитов
#ebedf0 0 0
#9be9a8 1 1-2
#40c463 2 3-5
#30a14e 3 6-10
#216e39 4 11+

Для надёжности в каждой непустой ячейке создаём минимум коммитов на уровень: 0, 1, 3, 6, 11.

Структура сетки

7 строк (дни недели, 0 = воскресенье), ~53 колонки (недели за последний год).

        Недели (~53)
     ←────────────→
   0 │ Sun Sun ... Sun │
   1 │ Mon Mon ... Mon │
   2 │ Tue Tue ... Tue │ 7 строк
   3 │ Wed Wed ... Wed │
   4 │ Thu Thu ... Thu │
   5 │ Fri Fri ... Fri │
   6 │ Sat Sat ... Sat │

Расчёт дат

startDate = сегодня − 364 дня
startDate = выровнять к предыдущему воскресенью
cellDate(row, col) = startDate + (col * 7) + row дней

Jagged grid: строки от 0 до todayDayOfWeek имеют на 1 колонку больше (текущая неделя ещё не завершена).

Создание коммитов

const timestamp = "2025-03-15T12:30:45";
execSync(`git commit --allow-empty -m "Activity commit ${timestamp}"`, {
  env: { ...process.env, GIT_AUTHOR_DATE: timestamp, GIT_COMMITTER_DATE: timestamp }
});

Ограничения

  • Время: 5 минут.
  • Даты коммитов не могут быть в будущем.
  • Формат сообщения: Activity commit YYYY-MM-DDTHH:MM:SS.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти