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"])
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" ])