Skip to content

Instantly share code, notes, and snippets.

@jytaso
Created December 13, 2019 05:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jytaso/16709eca12c5cdee1e4b3a9a8f14d930 to your computer and use it in GitHub Desktop.
Save jytaso/16709eca12c5cdee1e4b3a9a8f14d930 to your computer and use it in GitHub Desktop.
from dataclasses import dataclass
@dataclass(unsafe_hash=True)
class Team:
group: str
rank: int
name: str
country: str
class LotterySimulator:
def __init__(self, teams):
self.teams = sorted(teams, key=lambda x: -x.rank)
self.pairs = len(self.teams) // 2
self.mappings = [[] for _ in range(self.pairs)]
for i in range(self.pairs):
team2 = self.teams[i]
for j in range(self.pairs):
team1 = self.teams[j + self.pairs]
if team1.country != team2.country and team1.group != team2.group:
self.mappings[i].append(j)
self.ans = [[0] * self.pairs for i in range(self.pairs)]
self.cnts = 0
def draw(self):
tmp = []
visited = [0] * self.pairs
def dfs(x):
if x >= self.pairs:
self.cnts += 1
for i, j in enumerate(tmp):
self.ans[i][j] += 1
return
for j in self.mappings[x]:
if not visited[j]:
tmp.append(j)
visited[j] = 1
dfs(x + 1)
tmp.pop()
visited[j] = 0
return
dfs(0)
return self.ans
if __name__ == "__main__":
arr = [
('A', 1, '巴黎', '法甲'),
('A', 2, '皇马', '西甲'),
('B', 1, '拜仁', '德甲'),
('B', 2, '热刺', '英超'),
('C', 1, '曼城', '英超'),
('C', 2, '亚特兰大', '意甲'),
('D', 1, '尤文', '意甲'),
('D', 2, '马竞', '西甲'),
('E', 1, '利物浦', '英超'),
('E', 2, '那不勒斯', '意甲'),
('F', 1, '巴萨', '西甲'),
('F', 2, '多特', '德甲'),
('G', 1, '莱比锡', '德甲'),
('G', 2, '里昂', '法甲'),
('H', 1, '瓦伦西亚', '西甲'),
('H', 2, '切尔西', '英超')
]
teams = [Team(*i) for i in arr]
ls = LotterySimulator(teams)
ans = ls.draw()
rows = ls.teams[:ls.pairs]
cols = ls.teams[ls.pairs:]
import pandas as pd
df = pd.DataFrame(ans, index=[i.name for i in rows], columns=[i.name for i in cols]) / ls.cnts
print(df)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment