Описание
Утилита распределяет заданное общее время по задачам равномерно или по весам, выводит таблицу в ЧЧ:ММ и, по желанию, колонку десятичных часов в формате 0.01 или 0.1 с контролем, чтобы сумма десятичной колонки совпадала с общим временем
Особенности
- Равномерное или взвешенное распределение методом наибольших остатков, чтобы сумма минут ровно совпала с общим бюджетом
- Опциональное квантование по 0.1 часа, где 0.1 часа = 6 минут, с распределением «квантов» тоже методом наибольших остатков и точной суммой по десятым
- Десятичные часы 0.01 или 0.1 рассчитываются через Decimal.quantize с ROUND_HALF_UP и балансируются так, чтобы сумма десятичной колонки строго равнялась общим часам в выбранном формате
Интерактивный сценарий
- Введите общее время: допускаются форматы ЧЧ, десятичные часы (например 7.5), либо ЧЧ:ММ (например 7:30)
- Укажите количество задач и выберите режим распределения: поровну или по весам, где большие веса получают больше минут
- По желанию включите квантование по 0.1 часа, чтобы распределение шло кратно 6 минутам и сумма десятичных десятых получалась ровно, например 2.0 часа = 20 квантов
- По желанию включите вывод колонки десятичных часов и выберите формат 0.01 или 0.1, при этом используются Decimal.quantize и ROUND_HALF_UP для привычного округления, а сумма колонки балансируется до точного общего времени
Пример
- Вход: 2 часа и 7 задач при квантовании 0.1 часа приведёт к 6 задачам по 18 минут (0.3 часа) и 1 задаче 12 минут (0.2 часа), что суммарно даёт 2.0 часа и 120 минут
- Пояснение: 2.0 часа = 20 десятых, распределение квантов методом наибольших остатков даёт набор из шести 0.3 и одного 0.2 при равных долях, сохраняя общий бюджет и корректность округления
Формулы и правила округления
- Перевод минут в десятичные часы:
\text{часы}_{\text{дец.}} = \frac{\text{минуты}}{60}, например 17 минут ≈ 0.2833 часа - В формате 0.01 используется округление HALF_UP до сотых, например
\text{round\_half\_up}\left(\frac{17}{60}, 2\right) = 0.28 - В формате 0.1 каждая 0.1 часа равна 6 минутам, поэтому 17 минут округляются до 0.3 часа при округлении к ближайшей десятой по HALF_UP и при квантовании по десятым
Режимы распределения
- Равномерный: все задачи получают равные доли, округление в целых минутах осуществляется методом наибольших остатков, чтобы сумма минут совпала с бюджетом
- По весам: доля каждой задачи пропорциональна весу, с тем же методом наибольших остатков для целочисленных минут
- Квантование 0.1 часа: распределение идёт в «квантах» по 6 минут, что гарантирует точную сумму в десятичных десятых и соответствует многим практикам учёта времени
Колонка десятичных часов
- 0.01: балансированное округление до сотых через Decimal.quantize(ROUND_HALF_UP), чтобы сумма десятичных часов была ровно равна общему времени, например 2.00
- 0.1: балансированное округление до десятых, совместимое с квантованием по 6 минут, что обеспечивает, к примеру, ровно 2.0 часа суммой по колонке
Ограничения и заметки
- Для режима квантования 0.1 часа общее время должно делиться на 6 минут без остатка, иначе будет предупреждение и переход к поминутному распределению, чтобы не нарушать бюджет .
- Балансирование десятичной колонки обеспечивает совпадение суммы с общим временем, минимально меняя значения строк в пределах одного знака выбранного формата
Description
Languages
Python
100%