"""Временная составляющая оценки по занятой методике. Скорость даёт непрерывный вклад, а превышение норматива дополнительно отмечается как E3. Линейный множитель 1 − t/(2T) ограничен диапазоном 0–1: нулевое время даёт полный вклад, два норматива и более — нулевой. """ def time_credit(elapsed_ms: int | None, limit_ms: int) -> float: """Доля веса временной метрики, 0–1; отсутствие доказанного времени — 0.""" if elapsed_ms is None or elapsed_ms < 0 or limit_ms <= 0: return 0.0 return round(max(0.0, min(1.0, 1.0 - elapsed_ms / (2 * limit_ms))), 4)