Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 967607
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 16, 20262026-05-16T02:20:45+00:00 2026-05-16T02:20:45+00:00

I love challenges like this, I’ll hopefully submit my answer soon. Which player has

  • 0

I love challenges like this, I’ll hopefully submit my answer soon.

Which player has the best 7 card hand?

Given an unordered list of 9 cards (separated by a space), work out which player has the best poker hand. Here is a list of poker hand rankings. Example input:

2C 5H AS KS 2D 4D QD KH 3S
(ie: [[2C 5H] [AS KS] [2D 4D QD KH 3S]])

First 2 cards in the array represent player 1’s hand, second 2 in the array represent player 2’s hand. The last 5 cards represent the community cards, cards both players share. In effect, both players have 7 cards, and you must determine which player has the best 5 card poker hand.

A card is defined as a string, with the first character representing the card value, and the second value representing the suit. Always upper-case. No card may appear twice.

The function will calculate if the hand is a draw or a win to either player. It will ouput the totals at the end of the input. The output format is defined later on in this post.

Examples

2C 5H AS KS 2D 4D QD KH 3S
(ie: [[2C 5H] [AS KS] [2D 4D QD KH 3S]])
Player 2 wins this hand.  Player 1 has a pair of 2's, player 2 has a pair of kings.

5S 6S 8H 9D 7S 8S JH TS 2H
(ie: [[5S 6S] [8H 9D] [7S 8S JH TS 2H]])
Player 1 wins this hand  Player 1 has a flush, player 2 has a straight.

2S 2H AC AS 2C AH 9H TS 2D    
(ie: [[2S 2H] [AC AS] [2C AH 9H TS 2D]])
Player 1 wins this hand.  Player 1 has quads, player 2 has a full house

5S 6S 2D 4D 9S AS KD JC 9D
(ie: [[5S 6S] [2D 4D] [9S AS KD JC 9D]])
A draw.  Both players have Ace high.

More Info

Thanks to mgroves for the following link to Project Euler which has a similar problem:
http://projecteuler.net/index.php?section=problems&id=54

Test Data

We will use the Project Euler test data:

http://projecteuler.net/project/poker.txt

Your solution should accept that text file as input, and output a total of wins and draws.

Example Output

Output must be in this format:

1: 45
2: 32
D: 12

Player 1 won 45 hands, player 2 won 32 hands, and there were 12 draws. (Not actual results)

Rules

  • Doesn’t have to return the winning hand type, only WHO won if anyone
  • Card list input has no particular order
  • No card appears twice in the input
  • Input is always uppercase
  • Takes the Project Euler test data as an input
  • Outputs a count, of which player won the most hands and total draws in given format above
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-16T02:20:46+00:00Added an answer on May 16, 2026 at 2:20 am

    Perl, 414 398 370/458 344/416 char

    Line breaks are not significant.

    %M=map{$_,$Z++}0..9,T,J,Q,K,A;sub N{/.$/;$M{$`}.$&}
    
    sub B{$s=@p=();
    for$m(@_){$m-$_||($s+=2,++$p[$m])for@_}
    @_=sort{$p[$b]-$p[$a]||$b-$a}@_;
    $s=23 if$s<11&&($_[0]-$_[4]<5||$_[0]-$_[1]>8&&push@_,shift);
    "@_"=~/.$/;$s+=14*(4<grep/$&/,@_);
    $s=100*$s+$_ for@_;$s}
    
    ++$X{B((@c=map{N}split)[0..4])<=>B(@c[5..9])}for<>;
    printf"1: %d\n2: %d\nD: %d\n",@X{1,-1,0}
    

    This solves the “10 card” problem (10 cards are dealt, player 1 has the first 5 cards and player 2 has the second 5 cards).

    The first section defines a subroutine N that can transform each card so that it has a numerical value. For non-face cards, this is a trivial mapping (5H ==> 5H) but it does transform the face cards (KC => 13C, AD => 14D).

    The last section parses each line of input into cards, transforms the cards to contain numerical values, divides the cards into separate hands for the two players, and analyzes and compares those hands. Every hand increments one element of the hash %X. When all the input is parsed, %X contains the number of hands won by player 1, won by player 2, or ties.

    The middle section is a subroutine that takes a set of five cards as input and produces a
    12-digit number with the property that stronger poker hands will have higher-valued numbers. Here’s how it works:

        for$m(@_){$m-$_||($s+=2,++$p[$m])for@_}
    

    This is the “pair” detector. If any two cards have the same numerical value, increment a hash element for one of the cards and increase the “score” variable $s by two. Note that we will end up comparing each card to itself, so $s will be at least 10 and $p[$x] will be at least one for every card $x. If the hand contains three of a kind, then those three cards will match with the other two cards — it will be like there are 9 matches among those three cards and the “score” will be at least 18.

        @_=sort{$p[$b]-$p[$a]||$b-$a}@_;
    

    Sort the cards by (1) the number of times that card is part of a “pair” and (2) the value of the card. Thus in a hand with two 7’s and two 3’s, the two 7’s will appear first, followed by the two 3’s, followed by the kicker. In a hand with two 7’s and three 3’s, the three 3’s will be first followed by the two 7’s. The goal of this ordering is to distinguish two hands that have the same score — a hand with a pair of 8’s and a hand with a pair of 7’s both have one pair, but we need to be able to tell that a pair of 8’s is better.

        $s=23 if$s<11&&($_[0]-$_[4]<5||$_[0]-$_[1]>8&&push@_,shift);
    

    This line is the “straight” detector. A straight is worth 23 points and occurs when there are no pairs in the hand ($s<11 means only 5 “pairs” – each card matching with itself – were found) and either (1) the value of the highest card is exactly four more than the value of the lowest card ($_[0]-$_[4]==4), or (2) the highest value card is an Ace and the next highest card is a 5 ($_[0]-$_[1]==9), which means the hand has an A-2-3-4-5 straight. In the latter case, the Ace is now the least valuable card in the hand, so we manipulate @_ to reflect that (push@_,shift)

        "@_"=~/.$/;$s+=14*(4<grep/$&/,@_);
    

    This line is the flush detector. A flush is worth 14 more points and occurs when the last character is the same for each card. The first expression ("@_"=~/.$/) has the side effect of setting $& to the last character (the suit) of the last card in the hand. The final expression (4<grep/$&/,@_) will be true if and only if all elements of @_ have the same last character.

        $s=100*$s+$_ for@_;$s}
    

    Creates and returns a value that begins with the hand’s score and then contains the values of the cards, in order of the card’s importance. Scores for the various hands will be

    Hand           Score
    ----------    ------
    High card       10     (each card matches itself for two points)
    One pair        14     (2 additional matches)
    Two pair        18     (4 additional matches)
    Three of a kind 22     (6 additional matches)
    Straight        23     (no pair, but 23 points for straight)
    Flush           24     (no pair, but 14 additional points for the flush)
    Full house      26     (8 additional matches)
    4 of a kind     34     (12 additional matches)
    Straight flush  37     (23 + 14 points)
    

    which is consistent with the rules of poker. Hands with the same score can be distinguished by the values of the hand’s cards, in order of importance to the hand, all the way down to the least valuable card in the hand.

    The solution to the 9 card problem (two cards to player 1, two cards to player 2, the players share the next 5 cards and build their best 5 card hand) needs about 70 more strokes to choose the best 5 card hand out of the 7 cards available to each player:

    %M=map{$_,$Z++}0..9,T,J,Q,K,A;sub N{/./;$M{$&}.$'}
    
    sub A{my$I;
    for$k(0..41){@d=@_;splice@d,$_,1for$k%7,$k/7;$s=@p=();
    for$m(grep$_=N,@d){$m-$_||($s+=2,$p[$m]++)for@d}
    @d=sort{$p[$b]-$p[$a]||$b-$a}@d;
    $s=23 if$s<11&&($d[0]-$d[4]<5||$d[0]-$d[1]>8&&push@d,shift@d);
    "@d"=~/.$/;$s+=14*(4<grep/$&/,@d);
    $s=100*$s+$_ for@d;
    $I=$s if$s>$I}$I}
    
    ++$X{A((@c=split)[0,1,4..8])<=>A(@c[2..8])}for<>;
    printf"1: %d\n2: %d\nD: %d\n",@X{1,-1,0}
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.