Войти Регистрация
Фронтенд

84. Разбить заказ Ozon на посылки до 25 кг

Лёгкая

На экране оформления Ozon показывает, сколькими посылками приедет заказ. Склад собирает коробки по порядку товаров в корзине, лимит одной посылки — 25 кг.

Напишите packParcels(items, maxGrams). items — массив { sku, grams } в порядке корзины. Идём по нему и кладём товар в текущую посылку, если её вес с этим товаром не больше maxGrams; иначе открываем новую.

Товар тяжелее лимита (холодильник на 60 кг) едет отдельной посылкой: соседей к нему не кладём. Пустых посылок в ответе нет. Вернуть массив посылок, каждая — массив sku.

В работе: Подпись «Придёт 3 посылками» в оформлении заказа: 40 % заказов с бытовой техникой делятся.

Пример 1: ровно в лимит

Аргументы теста
[{"sku": "чайник", "grams": 1500}, {"sku": "гантели", "grams": 23500}, {"sku": "коврик", "grams": 900}], 25000
Ожидается
[["чайник", "гантели"], ["коврик"]]

Пример 2: всё в одну

Аргументы теста
[{"sku": "книга", "grams": 400}, {"sku": "кружка", "grams": 350}], 25000
Ожидается
[["книга", "кружка"]]
Как проверяем Объявите packParcels — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 7: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function packParcels(items, maxGrams) // → string[][]
массивыжадный проходreduce

Источник: на задачах Ozon: оформление заказа, деление на посылки. Условие пересказано своими словами.