Skip to content

Instantly share code, notes, and snippets.

@Kevinpgalligan
Created May 11, 2024 16:07
Show Gist options
  • Save Kevinpgalligan/9e64c54b55f5f23408a67098bc83e625 to your computer and use it in GitHub Desktop.
Save Kevinpgalligan/9e64c54b55f5f23408a67098bc83e625 to your computer and use it in GitHub Desktop.
Calculating final rankings for The Circle USA Season 6
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