Пусть есть тест с известными правильными ответами и диапазонами ответов на каждый вопрос.
Для определённости возьмём возможные ответы как 0 или 1.
Сложность каждого задания заранее не известна.
In [77]:
%matplotlib inline
import math
import matplotlib.pyplot as plt
import numpy as np
Данные
In [42]:
# правильные ответы заданий
good = 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1
good
Out[42]:
In [70]:
# полученные ответы от участников, построчно
gots = ((0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1),
(0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
(1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0),
(0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0))
gots
Out[70]:
Расчёты
In [58]:
# Расчёт правильности ответов
corr = [[1 if rep[i] == good[i] else 0 for i in xrange(len(good))] for rep in gots]
corr
Out[58]:
In [59]:
# число правильных ответов для каждого вопроса
corrbyn = [0 for i in xrange(len(good))]
for v in corr:
for a in xrange(len(good)):
corrbyn[a] += v[a]
corrbyn
Out[59]:
In [60]:
# пусть ценности ответов равны, ценности вопросов обратно пропорциональны числу правильно на них ответивших
# рассчитаем ценность каждого вопроса
ngots = len(gots)
qual = [ngots - x for x in corrbyn]
qual
Out[60]:
In [61]:
# уточнённые ответы с ценностями
corq = [[v[i] * qual[i] for i in xrange(len(v))] for v in corr]
corq
Out[61]:
In [76]:
# суммы баллов каждого участников
balls = [sum(v) for v in corq]
balls
Out[76]:
In [63]:
# победители, отсортированно
wins = sorted(list(enumerate(balls)), key=lambda x: x[1], reverse=True)
wins
Out[63]:
Результаты
In [69]:
print "\nТаким образом, победил участник №", wins[0][0]+1, "с", wins[0][1], "баллами, затем участник №", wins[1][0]+1, "с", wins[1][1], "баллами, и т.д.\n"
In [75]:
# расстановка по местам
for i, u in enumerate(wins):
print "место %2d -- участник %2d, баллы: %3d" % (i+1, u[0]+1, u[1])
In [105]:
plt.bar(range(len(balls)), balls)
Out[105]:
In [ ]: