Code works fine except...

MRAB google at mrabarnett.plus.com
Tue May 5 13:33:58 EDT 2009


Ross wrote:
> On May 5, 12:32 am, John Yeung <gallium.arsen... at gmail.com> wrote:
>> On May 5, 1:12 am, John Yeung <gallium.arsen... at gmail.com> wrote:
>>
>>> [...] the problem may require bigger guns (either much better
>>> math or much more sophisticated programming).
>> Yes, I'm responding to myself.
>>
>> Well, I went ahead with the approach I mentioned earlier, generating
>> all possible matches and then selecting among them as needed to fill
>> up the courts, trying to keep the number of matches played by each
>> player as fair as possible.  (I should mention that this, or something
>> similar, was suggested earlier by someone else in a different thread,
>> in response to the same question by the same OP.)
>>
>> I did use "bigger guns" (mainly a class for player objects, with
>> custom __cmp__ method), but still didn't do anything with doubles.
>>
>> I haven't tested it much, but I'll post it if anyone's interested.
>> (That way people can pick on me instead of the OP. ;)
>>
>> John
> 
> I'm interested to see what you did. From your description, it sounds
> like I've tried what you've done, but when I implemented my version,
> it took minutes to evaluate for bigger numbers. If that isn't the case
> with yours, I'd be interested in seeing your implementation.
> 
Here's my approach (incomplete):

def get_pair(player_list, played):
     for first in range(len(player_list)):
         player_1 = player_list[first]
         for second in range(first + 1, len(player_list)):
             player_2 = player_list[second]
             pair = player_1, player_2
             sorted_pair = tuple(sorted(pair))
             if sorted_pair not in played:
                 played.add(sorted_pair)
                 del player_list[second]
                 del player_list[first]
                 return pair
     return None

def round_robin(player_list, courts, played):
     playing = []
     for c in range(courts):
         pair = get_pair(player_list, played)
         if pair is None:
             break
         playing.append(pair)
     byes = player_list[:]
     player_list[:] = byes + [player for pair in playing for player in pair]
     yield playing, byes

def test_round_robin(players, rounds, courts, doubles=False):
     player_list = range(players)
     played = set()
     for r in range(rounds):
         for playing, byes in round_robin(player_list, courts, played):
             print playing, byes




More information about the Python-list mailing list