Сложность задач

Чтобы отображаемая участникам сложность задач не зависела только от экспертного мнения авторов и редакторов задач, в CodeRun используется динамический расчёт сложности. Динамическая сложность зависит от того, как пользователи сервиса решают задачи.

Механика расчёта показателя сложности задачи

Для расчёта сложности определим следующие параметры:

  •  — медианное количество попыток до успешного решения задачи включительно среди всех решавших задачу;
  •  — доля пользователей, решивших задачу , от всех решавших задачу, где .

Для каждой задачи считаем показатель сложности задачи .

Таким образом, чем больше решающих не смогли решить задачу и чем больше попыток необходимо до получения заветного вердикта «Решение зачтено», тем выше показатель сложности задачи.

Распределение задач по категориям

Считаем оптимальным следующее распределение сложностей задач в Каталоге:

  • Лёгкие — ;
  • Средние — ;
  • Сложные — .

Также вводим специальную начальную сложность «Не определена» для задач, которые попытались решить менее 50 пользователей сервиса.

Сортируем все задачи сервиса по возрастанию показателя сложности задач , убираем из отсортированного списка задачи со сложностью «Не определена», а затем делим список на кластеры в пропорции . Тогда первые задач — лёгкие, следующие задач — средние, оставшиеся  — сложные.

Переходный период

При таком подходе задачи на границах кластеров будут часто менять свою сложность (например, при появлении новых успешных решений). Поэтому, чтобы задача перешла в другой кластер (получила новую сложность), ей нужно пройти порог в  внутри этой новой сложности. То есть для повышения сложности нужно пересечь отметки в  и , для понижения — и  соответственно.

Периодичность обновлений

Перерасчёт динамической сложности задач производится раз в сутки.