Skip to content

Третье задание для осенней ШРИ Яндекс 2018

Notifications You must be signed in to change notification settings

HDuck/shri-2018a-task3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Яндекс ШРИ 2018

Задание 3 - Алгоритм

Описание работы

Алгоритм принимает входные данные в JSON формате, которые содержат информацию об устройствах, тарифах и максимально потребляемой мощности.

На выходе алгоритм предоставляет данные в JSON формате, которые содержат информацию о суточном расписании включения устройств, а также затраты на э/э в целом и для каждого устройства отдельно.

Принцип работы алгоритма smartHouse

Данные на входе

  1. Входные данные преобразуются из JSON строки в JS объект.
  2. Входные данные распределяются на устройства (дневные, ночные и общие) и тарифы (дневные, ночные и общие).
  3. Массивы устройств сортируются по мощности за один полный цикл работы (в сторону уменьшения).
  4. Массивы тарифов сортируются по цене (в сторону увеличения).

Распределение дневных устройств

Для каждого элемента из массива дневных устройств:

  1. Проверяем можно ли добавить устройство в текущее расписание (по времени, не разрывая цикл работы устройства).

  2. Проверяем не превышает ли устройство максимальную потребляемую мощность.

  3. Распределяем устройство по расписанию:

    3.1. Если мощность всех устройств, занесенных в расписание, на текущий час плюс мощность добавляемого не превышают максимальную потребляемую мощность, то добавляем 1 час работы устройства в расписание и расчитываем затраты на э/э за 1 час.

    3.2. Если нет возможности добавить устройство, то пропускаем текущий час.

    3.3. Если все часы текущего тарифа назначены/пропущены, а устройство еще не полностью занесено в расписание, то начинаем искать следующий тариф.

Распределение ночных устройств

Для каждого элемента из массива ночных устройств:

  1. Повторяем пункты 1-2 из распределения дневных устройств.

  2. Распределяем устройство по расписанию:

    2.1. Если текущий тариф заканчивается в эти же сутки:

    2.1.1. Повторяем пункты 1.1-1.3 из распределения дневных устройств.

    2.2. Если текущий тариф заканчивается на следующие сутки:

    2.2.1. Для времени до 24 часов - повторяем пункты 1.1-1.3 из распределения дневных устройств.

    2.2.2. Для времени от 0 часов - повторяем те же пункты, но с корректировкой времени.

Распределение общих устройств

Принцип тот же, что и для ночных устройств

Данные на возврат

  1. Округляем все значения затрат до 4 знаков после запятой.
  2. Преобразуем JS объект в JSON строку.

Алгоритм поиска searchEngine

  1. Если устройство только дневное/ночное и текущий тариф начинается/заканчивается на границе дня/ночи, то возвращаем тариф, который находится на другой границе.

  2. Для всех остальных тарифов и устройств:

    2.1. Ищем первый тариф, который начинается там, где закончился текущий.

    2.2. Проверяем есть ли в расписании на время первого тарифа текущее устройство.

    2.3. Ищем второй тариф, который заканчивается там, где начался текущий.

    2.4. Проверяем есть ли в расписании на время второго тарифа текущее устройство.

    2.5. Если совпадений по устройствам в обоих тарифах нет, то возвращаем более экономный тариф.

    2.6. Если совпадения есть в одном из тарифов, то возвращаем тариф, где нет совпадений.

    2.7. Если совпадения есть в обоих тарифах, то начинаем искать "вправо" тариф, который не содержит совпадений и возвращаем его.

Алгоритм расчета затрат rateCalc

  1. Проверяем устройство на наличие в списке устройств с затратами по э/э. Если нет, то добавляем в список.
  2. Расчитываем затраты на текущий час.
  3. Добавляем их в общие затраты и в затраты самого устройства.

About

Третье задание для осенней ШРИ Яндекс 2018

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published