From e2dc7a861a67ecd73a463059e91fd630a5e32a7e Mon Sep 17 00:00:00 2001 From: smolkik-code <81499306+smolkik-code@users.noreply.github.com> Date: Wed, 22 Oct 2025 17:06:59 +0700 Subject: [PATCH] Update README.md --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 863a3be..b404ec8 100644 --- a/README.md +++ b/README.md @@ -1 +1,45 @@ -# timesheet \ No newline at end of file +### Описание +Утилита распределяет заданное общее время по задачам равномерно или по весам, выводит таблицу в ЧЧ:ММ и, по желанию, колонку десятичных часов в формате 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 минут без остатка, иначе будет предупреждение и переход к поминутному распределению, чтобы не нарушать бюджет . +- Балансирование десятичной колонки обеспечивает совпадение суммы с общим временем, минимально меняя значения строк в пределах одного знака выбранного формата + +