On Wed, 6 Oct 2004 03:28:37 +0900
James Edward Gray II <james / grayproductions.net> wrote:

| On Oct 5, 2004, at 11:44 AM, Thomas Leitner wrote:
| 
| > Yes, I did this. I have run the program 10000 times now and it never
| > 
| > hung on me or produced false answers. I'm using
| >
| > [penguin 42] ~ > ruby -v
| > ruby 1.8.1 (2004-04-24) [i686-linux-gnu]
| 
| I'm using ruby 1.8.2pre2 on Mac OS X.
| 
| > Hmm, I just configured my system to use ruby 1.9
| >
| > [penguin 110] ~ > ruby -v
| > ruby 1.9.0 (2004-08-03) [i686-linux]
| >
| > and now it also began to hang...
| >
| > .... busy working ...
| >
| > So, after having this message open in my editor for too long now, it
| > 
| > "seems" I have found the problem. I changed the lines
| >
| > def choose_santas( list )
| >   list.each do |person, possible_santas|
| >     begin santa = possible_santas[rand( possible_santas.length )]
| >     end 
| > until verify_santa( list, person, santa )
| >     list.each_value { |value| value.delete( santa ) if Array ===
| >     value 
| > }
| >     list[person] = santa
| >   end
| > end
| 
| I made the change you gave, and reran my tests.  It still hung.  I
| went directly to your program and ran it manually, instead of through
| my testing harness.  It hung on the 19th attempt.  All runs are using
| the data set from the quiz.
| 
| I've tried to follow the logic in you're code and I believe I 
| understand the problem.  Basically, you verify at each step that santa
| 
| selection is valid, but that doesn't always account for future steps. 
| 
| Example, (with quiz data set):
| 
| Luke Skywalker gets Virgil Brigman for a santa
| 	Your script validates this choice,
| 	then removes Virgil from all possible santa lists.
| Leia Skywalker gets Lindsey Brigman for a santa
| 	Your script validates this choice,
| 	then removes Lindsey from all possible santa lists.
| Virgil Brigman gets Luke Skywalker for a santa
| 	Your script validates this choice,
| 	then removes Luke from all possible santa lists.
| Lindsey Brigman gets Leia Skywalker for a santa
| 	Your script validates this choice,
| 	then removes Leia from all possible santa lists.
| Bruce Wayne gets Gus Portokalos for a santa
| 	Your script validates this choice,
| 	then removes Gus from all possible santa lists.
| Gus Portokalos gets Bruce Wayne for a santa
| 	Your script validates this choice,
| 	then removes Bruce from all possible santa lists.
| 
| The above step is where the trap is set.  Bruce was the last valid
| name in Toula Portokalos' possible santa list and he has now been
| removed.  That list is empty.  Your script tries a final match for
| Toula, and loops infinitely over an empty list since verify_santa()
| will never return true now.

Yeah, you're right! I think I will invest more time next time in a good unit test :-) Thanks for your help!

Thomas