Сложность задач
Чтобы отображаемая участникам сложность задач не зависела только от экспертного мнения авторов и редакторов задач, в CodeRun используется динамический расчёт сложности. Динамическая сложность зависит от того, как пользователи сервиса решают задачи.
Механика расчёта показателя сложности задачи
Для расчёта сложности определим следующие параметры:
- — медианное количество попыток до успешного решения задачи включительно среди всех решавших задачу;
- — доля пользователей, решивших задачу , от всех решавших задачу, где .
Для каждой задачи считаем показатель сложности задачи .
Таким образом, чем больше решающих не смогли решить задачу и чем больше попыток необходимо до получения заветного вердикта «Решение зачтено», тем выше показатель сложности задачи.
Распределение задач по категориям
Считаем оптимальным следующее распределение сложностей задач в Каталоге:
- Лёгкие — ;
- Средние — ;
- Сложные — .
Также вводим специальную начальную сложность «Не определена» для задач, которые попытались решить менее 50 пользователей сервиса.
Сортируем все задачи сервиса по возрастанию показателя сложности задач , убираем из отсортированного списка задачи со сложностью «Не определена», а затем делим список на кластеры в пропорции . Тогда первые задач — лёгкие, следующие задач — средние, оставшиеся — сложные.
Переходный период
При таком подходе задачи на границах кластеров будут часто менять свою сложность (например, при появлении новых успешных решений). Поэтому, чтобы задача перешла в другой кластер (получила новую сложность), ей нужно пройти порог в внутри этой новой сложности. То есть для повышения сложности нужно пересечь отметки в и , для понижения — и соответственно.
Периодичность обновлений
Перерасчёт динамической сложности задач производится раз в сутки.