Welcome to the Monastery  
PerlMonks 
Re^2: RFC: Cribbage::Handby Limbic~Region (Chancellor) 
on Mar 31, 2006 at 17:58 UTC ( #540519=note: print w/ replies, xml )  Need Help?? 
hv,
Precalculating ScoresWhen calculating points for sums of 15 you do not need to consider the suit of the card. You can also consider 10, Jack, Queen, and King as the same since they all have the value of 10. This means that there are only 1993 unique hands necessary to calculate any cribbage hand for 15s. I used a bruteforce approach of summing all combinations of cards in group sizes of 25. I then realized that if there was no card present that had a value of 10 (T/J/Q/K), I could also safely determine the points resulting from 2/3/4 of a kind. The reason the code works may not be obvious so I have included comments.
If you have more than 1 2 of a kind or 3/4 of a kind then you can't possibly have a flush. I added a flag if I knew it was safe not to check. You also can't possibly have rightjack if no card has a value of 10  another flag. I could also determine the value of any straights if no card had a value of 10. Since there are only 10 possible sequences of cards that can score points for a run, I avoided using loops. I am just going to explain the algorithm and hope that the code is clear as a result.
The hand, the flags, and the score are outputed in 8 bytes. 5 for the hand, 1 for the flags, and 2 for the score. Calculate Total ScoreThe first step in calculating the total score is to convert the argument into the same format used to precalulate. We then lookup that hand and get back a 3 element array.
We know that we only have to check for 2/3/4 of a kind, straights, and rightjack if a card with the value of 10 is present. The method for determining 2/3/4 of a kind and straights has already been covered. To determine if we have rightjack:
Finally, we address potential flushes if necessary.
Cheers  L~R
In Section
Meditations

