Пример #1
0
def invalidate_problem(problem: Problem, save=True):
  query_list = list(problem.submission_set.filter(visible=True).values("author_id", "status"))
  ac_list = list(filter(lambda x: x["status"] == SubmissionStatus.ACCEPTED, query_list))
  problem.ac_user_count = len(set(map(lambda x: x["author_id"], ac_list)))
  problem.total_user_count = len(set(map(lambda x: x["author_id"], query_list)))
  problem.ac_count = len(ac_list)
  problem.total_count = len(query_list)
  reward_est = 5 - (2 * problem.ac_ratio + 3 * problem.ac_user_ratio) * min(log10(problem.ac_user_count + 1), 1.2) \
               + max(6 - 2 * log10(problem.ac_user_count + 1), 0)
  # reward_est = (max(reward_est, 0.) ** 2) / 10
  problem.reward = max(min(reward_est, 9.9), 0.1)
  for field in problem._meta.local_fields:  # pylint: disable=protected-access
    if field.name == "update_time":
      field.auto_now = False
  if save:
    problem.save(update_fields=["ac_user_count", "total_user_count", "ac_count", "total_count", "reward"])
Пример #2
0
def invalidate_problem(problem: Problem, save=True):
    query_list = list(problem.submission_set.all().values(
        "author_id", "status"))
    ac_list = list(
        filter(lambda x: x["status"] == SubmissionStatus.ACCEPTED, query_list))
    problem.ac_user_count = len(set(map(lambda x: x["author_id"], ac_list)))
    problem.total_user_count = len(
        set(map(lambda x: x["author_id"], query_list)))
    problem.ac_count = len(ac_list)
    problem.total_count = len(query_list)
    problem.reward = max(
        min(
            5 - (.02 * problem.ac_ratio + .03 * problem.ac_user_ratio) *
            min(log10(problem.ac_user_count + 1), 1.2) +
            max(6 - 2 * log10(problem.ac_user_count + 1), 0), 9.9), 0.1)
    for field in problem._meta.local_fields:
        if field.name == "update_time":
            field.auto_now = False
    if save:
        problem.save(update_fields=[
            "ac_user_count", "total_user_count", "ac_count", "total_count",
            "reward"
        ])