Desafio:
Dadas duas mãos de cinco cartas, determine qual delas vence pelo ranking padrão das mãos de pôquer .
Entrada:
Dez cartões separados por espaços do stdin ou como argumentos da linha de comando, o que você preferir. As cinco primeiras cartas são a mão do jogador 1, enquanto as últimas cinco são a mão do jogador 2. Cada cartão será uma sequência de duas letras no formato RS, onde R é o rank e S é o naipe. As classificações variam de 2-9, T para dez e J, Q, K e A para Jack, Queen, King e Ace, respectivamente. Os naipes são H, D, C, S para Copas, Diamantes, Paus e Espadas, respectivamente. Você deve gerar o número do jogador que vence: '1' ou '2'.
Exemplos de cartões:
AS - the Ace of Spades
QD - the Queen of Diamonds
2C - the Two of Clubs
TH - the Ten of Hearts
Exemplos de entrada para saída:
5H 5C 6S 7S KD 2C 3S 8S 8D TD -> 2
Explicação: O Jogador 1 tem um Par de Cincos enquanto o Jogador 2 tem um Par de Oito.
5D 8C 9S JS AC 2C 5C 7D 8S QH -> 1
Explicação: Nenhum dos jogadores tem nada de especial, mas a carta alta do jogador 1 é um ás, enquanto a carta alta do jogador 2 é uma rainha.
2D 9C AS AH AC 3D 6D 7D TD QD -> 2
Explicação: O jogador 1 possui três ases, o jogador 2 possui um Flush of Diamonds.
4D 6S 9H QH QC 3D 6D 7H QD QS -> 1
Explicação: Ambos os jogadores têm um par de rainhas, mas a segunda carta mais alta do jogador 1 é nove, enquanto o jogador 2 é sete.
Regras e esclarecimentos:
- Consulte a classificação padrão das mãos de pôquer para obter detalhes sobre a comparação de mãos.
- Você pode assumir que não há cartas repetidas em cada par de mãos.
- Você pode assumir que existe um vencedor definitivo em cada caso.
- O naipe não leva em consideração o ranking de uma mão. Por exemplo, dois royal flushes de naipes diferentes são iguais (portanto, qualquer entrada em que ambos os jogadores tenham um royal flush é inválida pela regra anterior).
- Como se trata de código de golfe, a resposta mais curta vence.
Notas:
- Relacionado a esta pergunta e a esta .
- Baseado no problema do projeto Euler 54
Respostas:
Haskell -
352339 caracteresCorre:
Ungolf'd e comentou, para que você possa ver o techinque:
fonte
Pitão -
774722707698685 caracteresEu escolhi gerar uma string para cada mão que a represente, começando com um caractere para o tipo de mão, seguido por caracteres que descrevem a variação específica do tipo (por exemplo, qual cartão você tinha apenas 4 de?), Seguido por os valores das cartas restantes em caso de empate (se ambos os jogadores tiverem o mesmo par duplo, a quinta carta terá que decidir quem ganha). Eu testei bastante, mas na verdade não jogo poker, então espero ter acertado. Além disso, eu sei que ainda não está totalmente jogado, provavelmente poderei raspar algumas dezenas de caracteres mais tarde.
fonte
_=lambda c:chr(97+c)
. Além disso, você tem algum espaço em branco desnecessário após:
s e=
s. Por fim, use em;
vez de novas linhas para separar instruções para reduzir o espaço em branco usado para indentação.JavaScript -
526508uso:
ungolfed:
fonte
fonte
perl,
801733 caracteresEu acredito que esta é uma implementação bastante direta. Basicamente, para cada mão, classificamos os naipes e os rostos separadamente. Em seguida, fazemos outra cópia dos rostos com ases com contagem baixa, para que possamos verificar retas com ases baixos. Depois, determinamos se temos um flush ou straight e qual é a carta mais alta. Depois, verificamos as partidas em ordem de pontuação (primeiro, verificamos os straight flushes, depois os quatro tipos, etc.). A pontuação real é apenas a concatenação do tipo de mão seguida pelos valores de face das cartas na ordem em que elas importam (isso é _s () na versão não-golfada, u () na versão do golfe). Aqui está:
E aqui está o equivalente a menos golfe:
fonte
AH 2C 3S 4S 5D 6C 7S 7C 7D TD
produz um resultado de2
, mas acho que uma sequência bate três do mesmo tipo