- Описание
- Отправленные решения
499. Календарь
В одной школе учились очень активные и разносторонние дети. Они посещали множество различных секций и кружков, а также у них было довольно плотное школьное расписание. Из-за такой загруженности школьники часто путались в своих планах и пропускали важные уроки.
Однажды, обсуждая свои проблемы с расписанием, они поняли, что им необходим общий календарь, где будут отмечены все занятия и события. Ребята решили создать такой календарь, чтобы всегда иметь перед глазами своё расписание и не пропускать занятия.
Школьники собрали всю информацию о всех событиях — осталось только отрисовать их в календарной сетке.
Формат ввода
Вам нужно отправить функцию вида:
module.exports = function solution(list, config) {
// your code here
return []
}
Первым аргументом функция получает список с датой начала и датой окончания события:
[{ "start": 1697428800, "finish": 1697434200 }, ...]
Вторым аргументом функция получает объект — конфиг календаря, со следующими полями:
dayWidth
— ширина одного дня (px);gap
— горизонтальный отступ между событиями (px);startWeek
— timestamp начала календаря.
Формат вывода
Функция должна вернуть список вида:
[{ day: 1, height: 240, width: 75, top: 30, left: 0 }, ...]
day
— день недели: 1, 2, 3, 4, 5;height
,width
— высота, ширина блока;top
,left
— позиция.
Примечание
Условия:
- Встречи, которые начинаются в одно и то же время, но отличаются по длительности, должны быть отсортированы по убыванию времени продолжения события (более длинные слева).
- Встречи, которые начинаются в разное время, должны быть отсортированы слева направо по времени начала.
- Для предыдущего правила есть исключение: если встреча начинается позже другой и может поместиться левее неё, то нужно эту встречу поместить левее в расписании. То есть встречи должны быть расставлены максимально плотно.
- Встреча должна быть максимально широкой.
- Все встречи стремятся занять максимально возможную для них ширину.
- Необходимо соблюдать отступ между событиями только ПО ГОРИЗОНТАЛИ. По вертикали встречи могут идти стык в стык, но не накладываться друг на друга.
Гарантируется:
- список событий ограничен одной рабочей неделей;
- 1 минута всегда соответствует 1 px;
- все выходные параметры блока в тестах целые (дробных чисел нет).
Файлы для тестирования можно скачать по ссылке ниже:
Ограничения
Ограничение времени
3 с
Ограничение памяти
640 МБ
Пример 1
[
{ "start": 1697428800, "finish": 1697443200 },
{ "start": 1697443800, "finish": 1697458200 },
{ "start": 1697428800, "finish": 1697431800 },
{ "start": 1697442000, "finish": 1697445000 },
{ "start": 1697429400, "finish": 1697443200 },
{ "start": 1697443800, "finish": 1697458200 },
{ "start": 1697515200, "finish": 1697531400 },
{ "start": 1697517000, "finish": 1697521200 },
{ "start": 1697519400, "finish": 1697524200 },
{ "start": 1697524800, "finish": 1697529000 },
{ "start": 1697532000, "finish": 1697544600 },
{ "start": 1697532000, "finish": 1697538000 },
{ "start": 1697537400, "finish": 1697544600 },
{ "start": 1697603400, "finish": 1697608800 },
{ "start": 1697605200, "finish": 1697611200 },
{ "start": 1697607000, "finish": 1697631000 },
{ "start": 1697608200, "finish": 1697621400 },
{ "start": 1697697000, "finish": 1697701800 },
{ "start": 1697699400, "finish": 1697701800 },
{ "start": 1697702700, "finish": 1697703300 },
{ "start": 1697703600, "finish": 1697708400 },
{ "start": 1697706900, "finish": 1697707800 },
{ "start": 1697702880, "finish": 1697704380 },
{ "start": 1697703000, "finish": 1697706600 },
{ "start": 1697702400, "finish": 1697717400 },
{ "start": 1697702400, "finish": 1697709900 },
{ "start": 1697774400, "finish": 1697790600 },
{ "start": 1697774400, "finish": 1697776200 },
{ "start": 1697778000, "finish": 1697781600 },
{ "start": 1697774700, "finish": 1697779800 },
{ "start": 1697775600, "finish": 1697779800 },
{ "start": 1697782200, "finish": 1697784000 }
]
[
{ "day": 1, "height": 50, "width": 75, "top": 30, "left": 80 },
{ "day": 1, "height": 240, "width": 75, "top": 30, "left": 0 },
{ "day": 1, "height": 230, "width": 75, "top": 40, "left": 160 },
{ "day": 1, "height": 50, "width": 75, "top": 250, "left": 80 },
{ "day": 1, "height": 240, "width": 75, "top": 280, "left": 0 },
{ "day": 1, "height": 240, "width": 75, "top": 280, "left": 160 },
{ "day": 2, "height": 270, "width": 75, "top": 30, "left": 0 },
{ "day": 2, "height": 70, "width": 75, "top": 60, "left": 80 },
{ "day": 2, "height": 80, "width": 75, "top": 100, "left": 160 },
{ "day": 2, "height": 70, "width": 155, "top": 190, "left": 80 },
{ "day": 2, "height": 100, "width": 75, "top": 310, "left": 80 },
{ "day": 2, "height": 210, "width": 75, "top": 310, "left": 0 },
{ "day": 2, "height": 120, "width": 75, "top": 400, "left": 160 },
{ "day": 3, "height": 90, "width": 55, "top": 60, "left": 0 },
{ "day": 3, "height": 100, "width": 55, "top": 90, "left": 60 },
{ "day": 3, "height": 400, "width": 55, "top": 120, "left": 120 },
{ "day": 3, "height": 220, "width": 55, "top": 140, "left": 180 },
{ "day": 4, "height": 80, "width": 115, "top": 180, "left": 0 },
{ "day": 4, "height": 40, "width": 115, "top": 220, "left": 120 },
{ "day": 4, "height": 125, "width": 43, "top": 270, "left": 48 },
{ "day": 4, "height": 250, "width": 43, "top": 270, "left": 0 },
{ "day": 4, "height": 10, "width": 43, "top": 275, "left": 96 },
{ "day": 4, "height": 25, "width": 43, "top": 278, "left": 144 },
{ "day": 4, "height": 60, "width": 43, "top": 280, "left": 192 },
{ "day": 4, "height": 80, "width": 43, "top": 290, "left": 96 },
{ "day": 4, "height": 15, "width": 91, "top": 345, "left": 144 },
{ "day": 5, "height": 30, "width": 55, "top": 30, "left": 60 },
{ "day": 5, "height": 270, "width": 55, "top": 30, "left": 0 },
{ "day": 5, "height": 85, "width": 55, "top": 35, "left": 120 },
{ "day": 5, "height": 70, "width": 55, "top": 50, "left": 180 },
{ "day": 5, "height": 60, "width": 55, "top": 90, "left": 60 },
{ "day": 5, "height": 30, "width": 175, "top": 160, "left": 60 }
]