### Описание Утилита распределяет заданное общее время по задачам равномерно или по весам, выводит таблицу в ЧЧ:ММ и, по желанию, колонку десятичных часов в формате 0.01 или 0.1 с контролем, чтобы сумма десятичной колонки совпадала с общим временем ### Особенности - Равномерное или взвешенное распределение методом наибольших остатков, чтобы сумма минут ровно совпала с общим бюджетом - Опциональное квантование по 0.1 часа, где 0.1 часа = 6 минут, с распределением «квантов» тоже методом наибольших остатков и точной суммой по десятым - Десятичные часы 0.01 или 0.1 рассчитываются через Decimal.quantize с ROUND_HALF_UP и балансируются так, чтобы сумма десятичной колонки строго равнялась общим часам в выбранном формате ### Установка - Требуется Python 3.8+ и стандартная библиотека; дополнительных зависимостей нет, так как используется встроенный модуль decimal для точного округления - Сохраните файл скрипта, например time_split.py, и убедитесь, что у него есть права на исполнение или вызывайте через python интерпретатор ### Запуск - Linux/macOS: запустите командой python3 time_split.py из каталога со скриптом - Windows: запустите командой py time_split.py в терминале PowerShell или CMD ### Интерактивный сценарий - Введите общее время: допускаются форматы ЧЧ, десятичные часы (например 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 минут без остатка, иначе будет предупреждение и переход к поминутному распределению, чтобы не нарушать бюджет . - Балансирование десятичной колонки обеспечивает совпадение суммы с общим временем, минимально меняя значения строк в пределах одного знака выбранного формата