-
-
Save Kevinpgalligan/9e64c54b55f5f23408a67098bc83e625 to your computer and use it in GitHub Desktop.
Calculating final rankings for The Circle USA Season 6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import itertools | |
import sys | |
class P: | |
OLIVIA = "Olivia" | |
KYLE = "Kyle" | |
QT = "QT" | |
JORDAN = "Jordan" | |
LAUREN = "Lauren" | |
real_final_rank = [ | |
P.OLIVIA, | |
P.KYLE, | |
P.QT, | |
P.JORDAN, | |
P.LAUREN | |
] | |
known_rankings = { | |
P.OLIVIA: { | |
P.QT: 1, | |
P.KYLE: 2 | |
}, | |
P.KYLE: { | |
P.OLIVIA: 1, | |
P.LAUREN: 3 | |
}, | |
P.QT: { | |
P.KYLE: 1, | |
P.OLIVIA: 3 | |
}, | |
P.LAUREN: { | |
P.JORDAN: 1, | |
}, | |
P.JORDAN: { | |
P.LAUREN: 1, | |
P.QT: 4 | |
} | |
} | |
players = set(known_rankings.keys()) | |
possible_rankings_per_player = [] | |
for player in players: | |
player_known_rankings = known_rankings[player] | |
possible_rankings = [] | |
ranking_template = [None for _ in range(len(players)-1)] | |
for p, rank in player_known_rankings.items(): | |
ranking_template[rank-1] = p | |
unassigned_players = (players - set([player])) - set(player_known_rankings.keys()) | |
for perm in itertools.permutations(unassigned_players): | |
possible_ranking = ranking_template[:] | |
i, j = 0, 0 | |
while i < len(possible_ranking) and j < len(perm): | |
if possible_ranking[i] is None: | |
possible_ranking[i] = perm[j] | |
j += 1 | |
i += 1 | |
possible_rankings.append(possible_ranking) | |
possible_rankings_per_player.append(possible_rankings) | |
def matches_real_rank(final_rank, scores): | |
rank = 0 | |
for score in sorted(set(scores.values()), reverse=True): | |
ps_with_score = [p for p in final_rank if scores[p] == score] | |
for p in ps_with_score: | |
i = real_final_rank.index(p) | |
if not (rank <= i and i < rank+len(ps_with_score)): | |
return False | |
rank += len(ps_with_score) | |
return True | |
def print_solution(final_rank, scores, rankings): | |
for player in final_rank: | |
print(scores[player], player) | |
print() | |
for player, ranking in zip(players, rankings): | |
print(player + ":") | |
for i, p in enumerate(ranking): | |
print(" ", str(i+1) + ".", p) | |
print() | |
def print_table(final_rank, scores, rankings): | |
print("""<div class="cooltablewrap"> | |
<table> | |
<thead> | |
<tr> | |
<th>Rank</th> | |
<th>Olivia</th> | |
<th>Kyle</th> | |
<th>QT</th> | |
<th>Jordan</th> | |
<th>Lauren</th> | |
</tr> | |
</thead> | |
<tbody> | |
""") | |
for i in range(len(players)-1): | |
print(f"<tr><td>{i+1}</td>") | |
for p in real_final_rank: | |
player_i = next(i for i, x in enumerate(players) if p == x) | |
other_player = rankings[player_i][i] | |
print(f"<td>{other_player}</td>") | |
print("</tr>") | |
print("""</tbody> | |
</table> | |
</div>""") | |
print("-----_") | |
print(scores) | |
solution_no = 1 | |
for rankings in itertools.product(*possible_rankings_per_player): | |
scores = dict([(player, 0) for player in players]) | |
for ranking in rankings: | |
for i, player in enumerate(ranking): | |
scores[player] += len(players)-2-i | |
final_rank = list(players) | |
final_rank.sort(key=lambda p: scores[p], reverse=True) | |
if matches_real_rank(final_rank, scores): | |
print(f"#### SOLUTION no. {solution_no}") | |
solution_no += 1 | |
print_solution(final_rank, scores, rankings) | |
#print_table(final_rank, scores, rankings) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment