Poker hand analyser: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl 6}}: added </lang> as band-aid for problems with recent edit, notified author) |
(→{{header|Perl 6}}: use a grammar actions class) |
||
Line 2,076: | Line 2,076: | ||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
This solution handles jokers. It has been written |
This solution handles jokers. It has been written to use a Perl 6 grammar. |
||
<lang perl6>use v6; |
<lang perl6>use v6; |
||
Line 2,088: | Line 2,088: | ||
rule TOP { |
rule TOP { |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
$straight = straight($<hand>); |
|||
⚫ | |||
<rank($n[0], $n[1], $flush, $straight)> |
|||
⚫ | |||
rule hand { |
|||
:my %*PLAYED; |
:my %*PLAYED; |
||
{ %*PLAYED = () } |
{ %*PLAYED = () } |
||
Line 2,121: | Line 2,109: | ||
token face {:i <[2..9 jqka]> | 10 } |
token face {:i <[2..9 jqka]> | 10 } |
||
token suit {<[♥ ♦ ♣ ♠]>} |
token suit {<[♥ ♦ ♣ ♠]>} |
||
} |
|||
⚫ | |||
class PokerHand::Actions { |
|||
⚫ | |||
method TOP($/) { |
|||
⚫ | |||
⚫ | |||
⚫ | |||
my $flush = flush($/); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
multi |
multi sub rank(5,$,$,$) { 'five-of-a-kind' } |
||
multi |
multi sub rank($,$,$f,$s where {$f && $s}) { 'straight-flush' } |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
multi sub rank($,$,$,$) is default { 'high-card' } |
|||
sub n-of-a-kind($/) { |
sub n-of-a-kind($/) { |
||
my %faces := bag @<face-card>.map: -> $/ {~$<face>.lc}; |
my %faces := bag @<face-card>.map: -> $/ {~$<face>.lc}; |
||
Line 2,156: | Line 2,152: | ||
} |
} |
||
} |
} |
||
my PokerHand::Actions $actions .= new; |
|||
for ("2♥ 2♦ 2♣ k♣ q♦", # three-of-a-kind |
|||
"2♥ 5♥ 7♦ 8♣ 9♠", # high-card |
|||
"a♥ 2♦ 3♣ 4♣ 5♦", # straight |
|||
"2♥ 3♥ 2♦ 3♣ 3♦", # full-house |
|||
"2♥ 7♥ 2♦ 3♣ 3♦", # two-pair |
|||
"2♥ 7♥ 7♦ 7♣ 7♠", # four-of-a-kind |
|||
"10♥ j♥ q♥ k♥ a♥", # straight-flush |
|||
"4♥ 4♠ k♠ 5♦ 10♠", # one-pair |
|||
"q♣ 10♣ 7♣ 6♣ 4♣", # flush |
|||
## EXTRA CREDIT ## |
|||
"joker 2♦ 2♠ k♠ q♦", # three-of-a-kind |
|||
"joker 5♥ 7♦ 8♠ 9♦", # straight |
|||
"joker 2♦ 3♠ 4♠ 5♠", # straight |
|||
"joker 3♥ 2♦ 3♠ 3♦", # four-of-a-kind |
|||
"joker 7♥ 2♦ 3♠ 3♦", # three-of-a-kind |
|||
"joker 7♥ 7♦ 7♠ 7♣", # five-of-a-kind |
|||
"joker j♥ q♥ k♥ A♥", # straight-flush |
|||
"joker 4♣ k♣ 5♦ 10♠", # one-pair |
|||
"joker k♣ 7♣ 6♣ 4♣", # flush |
|||
"joker 2♦ joker 4♠ 5♠", # straight |
|||
"joker Q♦ joker A♠ 10♠", # straight |
|||
"joker Q♦ joker A♦ 10♦", # straight-flush |
|||
"joker 2♦ 2♠ joker q♦", # four of a kind |
|||
⚫ | |||
my $rank = do with PokerHand.parse($_, :$actions) { |
|||
⚫ | |||
⚫ | |||
else { |
|||
'invalid'; |
|||
} |
|||
say "$_: $rank"; |
|||
} |
|||
for ("2♥ 2♦ 2♣ k♣ q♦", # three-of-a-kind |
for ("2♥ 2♦ 2♣ k♣ q♦", # three-of-a-kind |
||
"2♥ 5♥ 7♦ 8♣ 9♠", # high-card |
"2♥ 5♥ 7♦ 8♣ 9♠", # high-card |