import sys; revert = 0 revert_pairs = [] #the list of mutual reverting pairs mutual_revert_pairs = [] #the list of unique users among reverting pairs mutual_revert_users = [] #a dictionary of user as key, and his number of edits as the value user_edits = {} #a dictionary with the line number (actual version number) as key, and the line label as value(i.e. line label is either the same as version number if not revert version, or equal to an older version number if it's a revert version) lineLabels = [] #a dictionary with the line number (actual version number) as key, and the author of that line as value lineAuthors = [] def getMutual(): global revert_users global mutual_revert_users for pair in revert_pairs: parts = pair.split("~!~") if parts[1] + "~!~" + parts[0] in revert_pairs: sorted_pair = "" if parts[0] < parts[1]: sorted_pair = parts[0] + "~!~" + parts[1] else: sorted_pair = parts[1] + "~!~" + parts[0] mutual_revert_pairs.append(sorted_pair) if parts[1] not in mutual_revert_users: mutual_revert_users.append(parts[1]) if parts[0] not in mutual_revert_users: mutual_revert_users.append(parts[0]) def printMutualPairs(): global mutual_revert_pairs for pair in mutual_revert_pairs: print pair def getLine(label): global lineLabels for line, ll in reversed(list(enumerate(lineLabels))): if lineLabels[line] == label: return line def readFile(): global user_edits global revert_pairs global lineLabels global lineAuthors global revert for ln in open(sys.argv[1],'r'): parts = ln.strip().split(' '); if parts[2] not in user_edits: user_edits[parts[2]] = 1 else: user_edits[parts[2]] = user_edits[parts[2]] + 1 if parts[1] == '1': revert += 1 #the found line is the version i-1 equal to this version j, and the revert is assumed to be between the author of i, and j line = getLine(int(parts[0])) #ignore cases when i-1, and i are equal (consecutive versions) if line >= len(lineLabels)-1: continue revertedU = lineAuthors[line + 1] revertingU = parts[2] if revertedU == revertingU: continue pair = revertedU + "~!~" + revertingU if pair not in revert_pairs: revert_pairs.append(pair) lineLabels.append(int(parts[0])) lineAuthors.append(parts[2]) #main part readFile() # number of reverts #print revert #calculating the score getMutual() score = 0 for pair in list(set(mutual_revert_pairs)): parts = pair.split("~!~") u1 = parts[0] u2 = parts[1] if user_edits[u1]