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;
  • все выходные параметры блока в тестах целые (дробных чисел нет).

Файлы для тестирования можно скачать по ссылке ниже:

https://disk.yandex.ru/d/e89s5yLwoTb-uQ

Ограничения

Ограничение времени

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 }
    ]

Теги

JavaScript Node.js 20.14
Нужно войти, чтобы отправить решение.Войти