The Poker Series consists of many short, well defined functions that when combined will lead to complex behavior. Our goal is to create a function that will take two hand matrices (defined below) and return the winning hand.
A hand matrix is 4x13 binary matrix showing the cards that are available for a poker player to use. This program will be expandable to use 5 card hands through 52 card hands! Suits of the cards are all equally ranked, so they only matter for determination of flushes (and straight flushes).
For each challenge, you should feel free to reuse your solutions from prior challenges in the series. To break this problem into smaller pieces, I am likely making architectural choices that are sub-optimal for speed. This is being done as an exercise in coding. The larger goal of this project can likely be done in a much faster, but more obscure way.
--------
A straight flush is 5 cards of the same suit (row) and five continuous ranks (columns). The Ace (first column) can also make a straight flush when combined with the last four columns. The columns represent A, 2, 3, ... K.
This hand matrix:
0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
represents a straight flush, so the return value from the function is TRUE.
This hand matrix does not:
0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
so the return value should be FALSE.
This hand matrix does represent a straight flush
1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Remember, hand matrices can contain any number of 1's from 0 to 52.
0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Would be FALSE for this function.
A second output argument should come from this function. It is a usedCards Matrix. It is of the same form as the hand Matrix, but it only shows the cards used to make the Straight Flush. If more than one straight flush can be made, return the higher ranking one (the one with the highest top card. Ace being the highest). If different suits are possible for the same straight flush, return the one higher up in the matrix.
define "higher up", is row 1 higher or lower than row 4?
Don't test with with 2 or more straight flushes with different rankings.
@Jean,
Huh? Is that a suggestion to add a test?
Yes, as for example test 8 in problem 333 : Poker Series 02: isQuads.
It is better to modify the last test case as hm = [0 0 0 0 0 0 0 0 1 1 0 1 1;
1 1 0 0 0 0 0 0 0 1 1 1 1;
1 0 0 0 0 0 0 0 0 1 1 1 1;
0 0 0 0 0 0 0 0 0 0 0 0 0];
y_correct.flag = true;
y_correct.usedCards = logical([0 0 0 0 0 0 0 0 0 0 0 0 0;
1 0 0 0 0 0 0 0 0 1 1 1 1;
0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0]), where I have interchanged the 2nd and 3rd rows of hm. The reason to make this change is that some solutions which simply check whether the row sum equals 5 are indeed incorrect.
Very late here since the last comment, but if you care to update, my code passed all the tests but it ran into an error when dealing with a normal flush. May want to put a test in there for five 1's in a single row but not consecutive
Is there a problem with the third test? Looks like a fourth test was being created. I think my solution should pass.
The second part of Test 3 looks incorrect. This problem has two straight flushes on rows 2 & 3. However, the expected solution only shows a straight flush on row 2
hm = [0 0 0 0 0 0 0 0 1 1 0 1 1
1 0 0 0 0 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0];
y_correct.flag = true;
y_correct.usedCards = logical([0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0])
assert(isequal(isStraightFlush(hm),y_correct))
This should satisfy the second part.. I think.
This should only satisfy the first part.
">
Number of 1s in the Binary Representation of a Number
319 Solvers
451 Solvers
80 Solvers
Vectorize the digits of an Integer
236 Solvers
136 Solvers