Skip to content

Instantly share code, notes, and snippets.

@parente
Created June 4, 2011 18:15
Show Gist options
  • Select an option

  • Save parente/1008154 to your computer and use it in GitHub Desktop.

Select an option

Save parente/1008154 to your computer and use it in GitHub Desktop.
'''
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)
print
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()
@bitpshr
Copy link
Copy Markdown

bitpshr commented Jun 5, 2011

Nice. So this is assuming the 'return user persistence' like we discussed is implemented?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment