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