Search code examples
setconditional-statementswolfram-mathematicaprobabilitypoker

How to check if hand contains one pair of cards in poker game using Mathematica?


In a poker where each player gets 5 cards from a 32 card deck, I am trying to calculate how many subsets contain exactly one pair using Mathematica. I created a deck with four suits and created subsets of all possible combinations of the cards and now I am trying to filter out all the wrong combinations using different methods to exclude the four of a kind and three of a kind and the full house. but the filter is still showing higher values than it actually is. The out put of my program is "115584" but the actual result should be "107520". Is there a combination that i forgot to remove? here is the code

deck = Sort[Join[Range[7, 14], Range[7, 14], Range[7, 14], Range[7, 14]]]
hand = Subsets[deck, {5}]
SetAttributes[onePair, Orderless]
onePair [{x_, x_, y_, z_, w_} /; x != y != z != w] := True;
Count[hand, _?onePair]

I also tried the following code but the output is still not correct

onePair [{___, x_, x_, ___}] := True; (*we need two cards with same number but different suit*)
onePair [{___, x_, x_, x_, ___}] := False; (*this is to remove three of a kind*)
onePair[{___, x_, x_, y_, y_, ___} /; x != y] := False;(*to exclude the full house probability*)
onePair[{___}] := False;
Count[hand, _?onePair]

Solution

  • Try this

    deck=Sort[Join[Range[7, 14], Range[7, 14], Range[7, 14], Range[7, 14]]];
    hands =Subsets[deck, {5}];
    onePair [{___, x_, x_, ___}] := True;
    onePair [{___, x_, x_, x_, ___}] := False;
    onePair[{___, x_, x_, ___, y_, y_, ___} /; x != y] := False;
    onePair[{___}] := False;
    Count[hands, _?onePair]
    

    where I modified your next to last pattern to insert ___ between your first pair and your second pair. That code gives your desired 107520.

    The way I discovered that was to use

    Take[Cases[hands, _?onePair],100]
    

    to look at the first hundred example hands that were supposed to contain only one pair and immediately saw hands like {7,7,8,9,9}.

    You can also eliminate the condition on the pattern, the desired result will be False whether x equals y or not and it still yields your desired 107520.