Created
June 4, 2011 18:15
-
-
Save parente/1008154 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ''' | |
| Copyright (c) Peter Parente 2011. All Rights Reserved. | |
| Licensed under the WTFPL. http://sam.zoy.org/wtfpl/ | |
| ''' | |
| class Clock: | |
| def __init__(self, seconds=600): | |
| self.meetingTime = seconds | |
| self.meetingTimeTaken = 0 | |
| self.userCount = 0 | |
| self.users = {} | |
| def add_user(self, i): | |
| user = self.users.setdefault(i, {}) | |
| user['present'] = True | |
| user.setdefault('timeTaken', 0) | |
| self.userCount += 1 | |
| return user | |
| def remove_user(self, i): | |
| user = self.users[i] | |
| user['present'] = False | |
| self.userCount -= 1 | |
| return user | |
| def talk_for(self, i, seconds): | |
| user = self.users[i] | |
| user['timeTaken'] += seconds | |
| self.meetingTimeTaken += seconds | |
| def get_inactive_time_taken(self): | |
| return sum((user['timeTaken'] for user in self.users.values() | |
| if not user['present'])) | |
| def get_user_time_remaining(self, i): | |
| user = self.users[i] | |
| return self.get_user_time_scheduled() - user['timeTaken'] | |
| def get_user_time_scheduled(self): | |
| ms = int(round(float(self.meetingTime - self.get_inactive_time_taken()) / self.userCount)) | |
| return ms | |
| def get_meeting_time_remaining(self): | |
| return self.meetingTime - self.meetingTimeTaken | |
| def print_state(self): | |
| print 'id\t\tSched\t\tTaken\t\tRemain' | |
| print 'Clock\t\t%d\t\t%d\t\t%d' % (self.meetingTime, self.meetingTimeTaken, | |
| self.get_meeting_time_remaining()) | |
| ts = tt = tr = 0 | |
| for i, user in self.users.iteritems(): | |
| if user['present']: | |
| s = self.get_user_time_scheduled() | |
| ts += s | |
| t = user['timeTaken'] | |
| tt += t | |
| r = self.get_user_time_remaining(i) | |
| tr += r | |
| print '%d\t\t%d\t\t%d\t\t%d' % (i, s, t, r) | |
| print 'Sum\t\t%d\t\t%d\t\t%d' % (ts, tt, tr) | |
| if __name__ == '__main__': | |
| c = Clock() | |
| print '3 users join before start' | |
| c.add_user(1) | |
| c.add_user(2) | |
| c.add_user(3) | |
| print 'u1 talks for 60, u2 for 30' | |
| c.talk_for(1, 60) | |
| c.talk_for(2, 30) | |
| c.print_state() | |
| print 'u1 leaves, u2 talks for 30' | |
| c.remove_user(1) | |
| c.talk_for(2, 30) | |
| c.print_state() | |
| print 'u4 joins, u2 talks for 30' | |
| c.add_user(4) | |
| c.talk_for(2, 30) | |
| c.print_state() | |
| print 'u1 returns, u2 talks for 90' | |
| c.add_user(1) | |
| c.talk_for(2, 90) | |
| c.print_state() | |
| print 'u2, u3 leave, u1 talks for 150' | |
| c.remove_user(2) | |
| c.remove_user(3) | |
| c.talk_for(1, 150) | |
| c.print_state() | |
| print 'u2, u3 return' | |
| c.add_user(2) | |
| c.add_user(3) | |
| c.print_state() | |
| print 'u3, u4 talk for 150' | |
| c.talk_for(3, 150) | |
| c.talk_for(4, 150) | |
| c.print_state() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Nice. So this is assuming the 'return user persistence' like we discussed is implemented?