В портфеле Т‑Инвестиций у бумаги показывают количество, среднюю цену покупки и прибыль по закрытым сделкам. Всё считается в копейках, чтобы не ловить ошибки дробей.
Напишите portfolio(trades). Сделка — { ticker, side, qty, price }, side — 'buy' или 'sell', price — цена одной бумаги в копейках, сделки идут по времени.
Покупка добавляет бумаги и их стоимость. Продажа списывает бумаги и долю стоимости Math.round(cost * qty / held); прибыль сделки — выручка минус эта доля. Средняя цена позиции — Math.round(cost / held), продажа её почти не двигает. Позиция, проданная целиком, пропадает, а следующая покупка считает среднюю заново.
Продажа больше, чем есть, — ошибка RangeError. Вернуть { positions: [[ticker, held, avg], ...] по алфавиту, realized }.
В работе: Экран портфеля: 30 бумаг, 2 000 сделок за год, средняя и прибыль пересчитываются после каждой сделки.
Пример 1: две покупки — средняя
[{"ticker": "SBER", "side": "buy", "qty": 10, "price": 30000}, {"ticker": "SBER", "side": "buy", "qty": 30, "price": 26000}]{"positions": [["SBER", 40, 27000]], "realized": 0}Пример 2: продажа не меняет среднюю
[{"ticker": "SBER", "side": "buy", "qty": 10, "price": 30000}, {"ticker": "SBER", "side": "buy", "qty": 30, "price": 26000}, {"ticker": "SBER", "side": "sell", "qty": 20, "price": 31000}]{"positions": [["SBER", 20, 27000]], "realized": 80000}portfolio — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 8: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function portfolio(trades) // → { positions: [ticker, held, avg][], realized }
Источник: на задачах Т‑Банка: портфель в Т‑Инвестициях. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.