Combinatorics Formula for Cards
I have five random cards of a standard 52-card deck, two face-down and
three face-up. I need a formula that generates a unique sequential
number for each possible combination of five cards.
It matters what cards are face-down vs. what cards are face-up. But it
doesn't matter what order the face-up cards are in or what order the
face-down cards are in. (If it didn't matter what order the cards
were in, this would be easy. There would be 2,598,960
(52x51x50x49x48/2/3/4/5) possible combinations.)
Example 1: Ah Ac | Kh Qh Jh is the same as
Ac Ah | Jh Kh Qh
Example 2: Ah Ac | Kh Qh Jh is not the same as
Jh Ac | Kh Qh Ah
There are 25,989,600 possible combinations (52*51/2 x 50*49*48/2/3 =
1326 x 19600 = 25,989,600). Which is too many for us to keep in memory
(this is for a computer program), so I'm adding some additional rules
which will reduce the number of unique combinations.
Reduction Rule #1:
Suits are interchangable as long of all cards of a suit remain the same suit.
For example,
Example 3: Ah Kh | Qh Jh Th is the same as
Ac Kc | Qc Jc Tc is the same as
Ad Kd | Qd Jd Td
Example 4: Ah Kh | Qc Jc Tc is not the same as
Ad Kd | Qd Jd Td is not the same as
Ah Kd | Qh Jd Td
Example 5: Ah Kh | Qh Jh Tc is the same as
Ah Kh | Qh Jh Td is the same as
As Ks | Qs Js Td
Reduction Rule #2:
A hand with a face-down card having no matching cards of that suit, is
identical to a hand with a face-down card having one matching board
card of that suit.
Example 6: Ah Kd | Qc Jc Ts is the same as
Ah Kd | Qc Jc Th is the same as
Ah Kd | Qc Jc Td
Example 7: Ah Kd | Qd Jc Ts is the same as
Ad Kh | Qd Jc Ts is the same as
Ac Ks | Qd Jc Ts
Example 8: Ah Kd | Qc Jc Ts is not the same as
Ah Kc | Qc Jc Ts
Example 9: Ah Kd | Qc Jc Ts is not the same as
Ah Kh | Qc Jc Ts is not the same as
Ah Kh | Qc Jc Th
Note: After taking Reduction Rule #2 into account, the only time we
should have a card combination that uses all four different suits
would be when we have four of a kind (all four cards of one suit). Any
other possible combination should be reducable to a fewer number of
suits.
What I Need:
I need a formula or short computer program that will accept five cards
as variables/parameters and returns a unique integer value that
reflects the rules above. The unique integers should be sequential so
that, if there are 1M unique integers, the integers should be numbered
0-1M.
If you would like, you can assume the integers passed as parameters
have already had the two reduction rules applied to them. I'm capable
of taking a raw formula and doing the work to turn it into a program.
Please include as much of the "theory" behind the formula as possible.
Qualifications for computer programs:
We realize applying Rule #1 and #2 may require a programatic solution.
But the bulk of the work should be formulaic. We're not just looking
for a fast code-based approach. Specifically:
1. It is NOT acceptible to do an array search or hash. We want
something faster. Array lookups are ok as long as the arrays are
reasonably sized (see #2).
2. It not acceptible to, at any point in your code, use arrays with
more elements than the total number of unique integers.
3. Speed is an issue. Make sure the program runs in less than, say,
1,000 operations. (A fraction of a second on any modern computer.)
4. Readability is important too. We'd like it to be less than 200 lines.
We'd prefer C# code but will take pseudo-code too.
Hints:
1. There will be no more than 2.6M unique integers.
2. My understanding is that a mathematician with experience in
combanatorics should have no problem with this. |