sub is_straight { my ($low,$high,$high_no_ace) = @_; return $low==2 ? ($high == 14 ? ($high_no_ace==5) : ($high == 6) ) : ($high-$low) == 4; } my %tr = (J => 11,Q => 12, K => 13, A => 14); @hand = map {s/^([JQKA])/$tr{$1}/;$_} @hand; my %suits; my %ranks; my $num_suits; my $num_ranks; my $low_rank = 100; my $high_rank = 0; my $high_rank_no_ace = 0; foreach my $card (@hand) { my ($r,$s) = $card =~ /(\d+)(.)/; if ($suits{$s}++ == 0) {$num_suits++} if ($ranks{$r}++ == 0) {$num_ranks++} $low_rank = min($r,$low_rank); $high_rank = max($r,$high_rank); $high_rank_no_ace = max($r,$high_rank_no_ace) unless $r == 14; } my @nranks = sort map {$ranks{$_}} keys %ranks; my $hand = 'high card'; { ($hand = 'straight flush',last) if $num_suits==1 && is_straight($low_rank,$high_rank,$high_rank +_no_ace); ($hand = 'four of a kind',last) if $nranks[1]==4; ($hand = 'full house',last) if $nranks[1]==3; ($hand = 'flush',last) if $num_suits==1; ($hand = 'straight',last) if $num_ranks == 5 && is_straight $low_rank,$high_rank,$high_ran +k_no_ace); ($hand = 'three of a kind',last) if $nranks[2]==3; ($hand = 'two pair',last) if $nranks[2]==2; ($hand = 'pair',last) if $nranks[3]==2; }
In reply to Re: Golf/Elegance: Poker Hands
by dreadpiratepeter
in thread Golf/Elegance: Poker Hands
by dreadpiratepeter
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |