On Wed, 6 Oct 2004 03:28:37 +0900
| 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