Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement