Условие
Написать скрипт 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.