import csv import random import sys Games = [] Users = set() class Game(object): name = "" stock = 0 winners = None def __init__(self, name="", stock=0): self.name = name self.stock = stock self.winners = set() def __repr__(self): return "%s (x%d)" % (self.name, self.stock) class User(object): name = "" wants = None def prune(self): global Users removes = [] for i in xrange(len(self.wants)): if self.wants[i].stock <= 0: removes.append(i) removes.reverse() for i in removes: self.wants.pop(i) if len(self.wants) == 0: print "Removing user %s" % self.name return True else: return False def win(self): global Users if len(self.wants) == 0: raise ValueError("User %s doesn't want anything" % self.name) won = self.wants[0] if won.stock <= 0: raise ValueError("Oversold game %s" % str(won)) print "%s wins %s" % (self.name, won.name) Users.remove(self) won.winners.add(self) won.stock = won.stock - 1 not_winners = set() if won.stock == 0: for user in Users: if user.prune(): not_winners.add(user) for u in not_winners: Users.remove(u) def __init__(self, line): global Games self.name = line[0] games = list(line[1:]) self.wants = [] i = 1 while games.count(str(i)) > 0: if games.count(str(i)) > 1: raise ValueError("User %s has multiple choice #%d" % (self.name, i)) self.wants.append(Games[games.index(str(i))]) i = i+1 print "%s wants %s" % (self.name, ", ".join(x.name for x in self.wants)) def __repr__(self): return self.name lines = csv.reader(open('drawing.csv', 'rb')) names = lines.next() Games = [Game(x) for x in names[1:]] stocks = lines.next() for i in xrange(len(Games)): Games[i].stock = int(stocks[i+1]) # Skip user header lines.next() # Load users Users.update(User(x) for x in lines if len(x) > 0 and x[0] != "") print print '==================' print # Draw winners while len(Users) > 0: winner = random.sample(Users, 1)[0] winner.win() print print '==================' print # Print results for game in Games: print '***' print print '## %s' % game.name print print 'Winners: %s' % (', '.join('[%(name)s](/user/%(name)s)' % x for x in game.winners)) print print 'Stock remaining: %d' % game.stock print