O desafio:
Nesta pergunta: Nomeie a mão de pôquer que você teve que pegar uma mão de cinco cartas e identifique-a. Esta pergunta é semelhante, com duas reviravoltas:
Primeiro, a saída será minúscula. Isso permite mais golfe, pois você não precisa se preocupar com a capitalização flush
estraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Em segundo lugar, com a popularidade do Texas Hold'em e do 7 card stud, nós do code golf poderemos marcar uma mão de sete cartas, certo? Ao marcar uma mão de sete cartas, use as cinco melhores cartas para sua mão e ignore as duas que você não precisa.
Referência:
Lista de mãos de pôquer: http://en.wikipedia.org/wiki/List_of_poker_hands
Entrada (levantada diretamente do encadeamento anterior)
7 cartas dos argumentos stdin ou da linha de comando. Um cartão é uma sequência de duas letras no formulário RS
, onde R é a classificação e S é o naipe. As fileiras são 2
- 9
(cartas de número), T
(dez), J
(Valete), Q
(Rainha), K
(Rei), A
(Ás). Os ternos são S
, D
, H
, C
para pás, diamantes, corações e clubes, respectivamente.
Exemplo de cartões
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Exemplo de entrada => saída desejada
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Observe que no segundo exemplo, na verdade, existem três pares, mas você só pode usar cinco cartas, por isso é two pair
. No quinto exemplo, há a three of a kind
e a straight
possível, mas a straight
é melhor, portanto, saída straight
.
Pontuação
Isso é código-golfe , então o código mais curto vence!
Errata
- Você não pode usar recursos externos.
- O ás é alto e baixo para retas.
Respostas:
Ruby 353
Isso foi baseado na resposta de Chron da pergunta original.
Isso leva a entrada como argumentos de linha de comando. Basicamente, iteramos todas as combinações de tamanho 5 para obter que tipo de mão é. Cada tipo de mão foi modificado para que comece com um número. ("royal flush" -> "0royal 4flush", "high card" -> "9high card"). Isso nos permite classificar as strings que foram retornadas. A primeira corda após a classificação é a melhor mão possível. Então, imprimimos isso após remover todos os números da string.
fonte
AS QS JS TS 9S 5H 5D
. Isso vai te custar um personagem!Haskell
618 603 598 525 512 504 480464Cartões tomados como uma linha de entrada. Eu acho que joguei isso até a morte, mas será facilmente derrotado por rubi, etc. usando o mesmo truque: se você gerar todas as permutações, obterá o tipo de avanço que deseja procurar em linha reta, mais o tipo de inversão que deseja para testar N de um tipo.
Editado para "par" embutido e usar prefixos numéricos depois de ver a entrada de @ FDinoff, também compôs funções de mapa para raspar mais um caractere.
fonte
"one pair","two pair"
é menor entãou=" pair" ... "one"++u,"two++u
C ++,
622553 caracteresquatro novas linhas desnecessárias adicionadas abaixo para maior clareza.
As coisas mudaram na versão golfed:
Rev 1: Alteradas todas as variáveis numéricas para
__int64
para uma única declaração.Rev 1: Incremento de golfe e condição de
for
loopsRev 0: Constantes octais alteradas para decimal.
Rev 0: Instruções alteradas
if
para atribuições com operador condicional. Rev 1: Reorganizado ainda mais em uma única expressão parat
. Isso exigiu nova variávelv
para um dos valores intermediáriosRev 0: Saída detalhada excluída. Somente produz a melhor mão geral.
Rev 0: Desistiu de compactar o texto de saída (difícil em C porque você não pode concatenar seqüências de caracteres usando o operador +.) Escrever "flush" apenas uma vez me salvou 12 caracteres, mas me custou 15, fazendo com que eu sofresse três caracteres em geral. Então, eu apenas escrevi 3 vezes.Rev 1: usado emstd::string
vez dechar[]
sugerido por FDinoff, possibilitando concatenar com+
.Versão não-gasta, 714 caracteres não-espaço em branco que não são comentários.
Loops através de todas as 21 mãos possíveis que podem ser feitas de 7 cartas e rejeita 2 cartas de cada vez. O naipe e o ranking das cinco cartas escolhidas são totalizados nas variáveis fe ep com um dígito octal diferente para cada naipe / ranking. Várias operações de bit são executadas para determinar o tipo de ponteiro, que é armazenado em t (todas as 21 possibilidades são produzidas na versão não-gravada). Finalmente, a melhor mão possível é produzida.
Saída não destruída
fonte
<string>
que suporta + para concatenação de strings. O que significa que você provavelmente poderia usar<iostream>
e usar.cout
No entanto, não sei se algum deles levaria a uma contagem menor de caracteres." pair flush flush straight of a kind"
= 35 caracteres. Depois de adicionar#include
economias, o mínimo é necessário considerar",=+
declarações extras e de constantes. Também sou novo em C ++ e luto com as configurações do IDE e do compilador (ele me obriga a usarscanf_s
e, emprintf_s
vez das antigas versões "inseguras", e a ajuda para corrigi-lo circula em círculos.)cout
Pode ajudar um pouco, é meu dever lista, mas provavelmente para outro programa. O quecout
me mata éusing namespace std
que não sei se há uma maneira de evitar escrever tudo isso.std::cout
para contornar ousing namespace std
gets_s
&puts
, maisstd::string
para concatenar, o que significa que devo converterchar*
em saída. O golfe que publiquei funciona com o Bizarrely, com apenasstring
ou apenas com o qualiostream.
devo incluir ambos, para usar os<<>>
operadores com ocin/cout
&std::string
s. No geral, o uso de#include
s funciona 5 bytes pior, embora eu possa declararh
como aestd::string
evitar umachar
declaração separada . Previsivelmente, não consigo encontrar uma lista do que está emnamespace std
ajuda (ou uma explicação sobre o operador.) #scanf
egets
, exceto no golfe, onde os programas são bastante inseguros. Eu poderia reduzir em 5 bytes-s,99
se pudesse usar emgets
vez degets_s
, mas não consigo o compilador me permitir. O que me surpreende é como o C / C ++ é inseguro em geral! Algumas semanas atrás, teria me chocado ao descobrir que_int64 x=1<<y
dá a resposta errada para y maior que 31. Mas agora estou levemente aborrecido. Tendo visto coisas com subscritos de matriz saindo dos limites sem nenhuma mensagem de erro, eu me acostumei. Existe alguma maneira de ativar uma verificação melhor?perl (> = 5,14),
411403400397400Editar : inline um sub que foi chamado apenas uma vez, economizando 8 caracteres.
Edit 2 : removeu um
.""
que sobrou de uma tentativa inicialEdit 3 : em vez de uma variável temporária que preserva o original
$_
, use um para torná-lo desnecessário. Ganho líquido de 3 caracteres.Edição 4 : falha corrigida na detecção de full house cheio (2 em 3). custa 3 caracteres.
Não é um vencedor, mas o detector reto é um conceito interessante, eu acho.
Versão expandida:
fonte
JavaScript 600
uso com nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
fonte