Pyth, 73 octets
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc
C'est assez terrible. Analyser les cartes, trier les valeurs, ... Tout prend tellement de caractères. Mais l'approche est intéressante.
Essayez-le en ligne: démonstration ou suite de tests
Explication:
Je génère les 52 cartes, supprime les quatre cartes de l'entrée, génère un score pour chaque carte (score de la main) et imprime la carte avec le score maximal.
Le score est un peu étrange. Si je compare le score de deux mains complètement différentes, il se peut que le mauvais gagnant soit choisi. Par exemple, une quinte bat 4 as. Mais ça marche, si les 4 premières cartes sont les mêmes dans les deux mains. Et mon score calculé n'est en fait pas une valeur, mais une liste de valeurs:
- G: Tout d'abord, je regroupe les 5 cartes par rang et prends les longueurs:
5h 5d 6c 5s Jd
->
[3, 1, 1]
- F: Ensuite, j'ajoute 4 moins le nombre de suites différentes à cette liste.
Flush
->
3
est ajouté, not flush
->
2/1/0
est ajouté.
- S: Ajoutez un autre numéro.
0
si ce n'est pas une ligne droite, 4
si c'est la ligne droite A2345
, ou 5
si c'est une ligne droite supérieure.
Ces listes de 4 à 7 numéros sont triées par ordre décroissant et la liste avec la valeur maximale est sélectionnée.
Pourquoi ça marche? Vous voyez ici les configurations possibles pour tous les types. La lettre à côté des chiffres vous indique avec quelle règle ce numéro a été généré.
- Quinte flush:
[5S, 3F, 1G, 1G, 1G, 1G, 1G]
ou[4S, 3F, 1G, 1G, 1G, 1G, 1G]
- Quatre d'une sorte:
[4G, 1G, 0F, 0S]
- Maison pleine:
[3G, 2G, 1F, 0S]
ou[3G, 2G, 0F, 0S]
- Affleurer:
[3F, 1G, 1G, 1G, 1G, 1G, 0S]
- Droit:
[5S, 2F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1F, 1G, 1G, 1G, 1G, 1G]
, [5S, 1G, 1G, 1G, 1G, 1G, 0F]
, [4S, 2F, 1G, 1G, 1G, 1G, 1G]
, [4S, 1F, 1G, 1G, 1G, 1G, 1G]
,[4S, 1G, 1G, 1G, 1G, 1G, 0F]
- Brelan:
[3G, 1G, 1G, 1F, 0S]
,[3G, 1G, 1G, 0F, 0S]
- Deux paires:
[2G, 2G, 2F, 1G, 0S]
, [2G, 2G, 1F, 1G, 0S]
,[2G, 2G, 1G, 0F, 0S]
- Une paire:
[2G, 2F, 1G, 1G, 1G, 0S]
, [2G, 1G, 1G, 1G, 1F, 0S]
,[2G, 1G, 1G, 1G, 0F, 0S]
- Carte haute:
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
, [1F, 1G, 1G, 1G, 1G, 1G, 0S]
,[1G, 1G, 1G, 1G, 1G, 0S, 0F]
Pyth compare les listes par élément. Il est donc évident qu'une quinte flush battra toujours Four of a kind. La plupart des règles de poker typiques sont évidentes avec ces listes. Certains semblent contradictoires.
- Un Straight gagnera contre Four of a Kind ou Full House: Pas de problème. Si vous avez une chance d'obtenir un Four of a Kind / Full House avec la carte River, vous ne pouvez pas atteindre une ligne droite en même temps (car vous avez déjà 2 ou 3 suites différentes dans votre main).
- Une quinte gagnera contre une couleur. Si vous pouvez atteindre une quinte et une quinte avec la carte de la rivière, vous pouvez également atteindre une quinte. Et la quinte flush a un meilleur score que la quinte et la quinte.
- Une paire
[2G, 2F, 1G, 1G, 1G, 0S]
gagnera contre quelques mains de deux paires. Pas de problème non plus. Si vous obtenez deux paires avec la carte rivière, alors vous en aviez au moins une paire avant la rivière. Mais cela signifie que vous pouvez vous améliorer en trois, ce qui est mieux. Donc, deux paires ne seront jamais la réponse.
- La carte haute
[2F, 1G, 1G, 1G, 1G, 1G, 0S]
gagnera contre quelques mains d'une paire. Si c'est le meilleur score que vous pouvez atteindre, avant la rivière, vous aurez 3 cartes d'une suite et une carte d'une suite différente. Mais ensuite, vous pouvez choisir la carte avec l'une de ces deux suites et avec une valeur qui apparaît déjà, et vous vous retrouverez avec le score [2F, 2G, ...]
, qui est également meilleur.
Donc, cela choisit le bon type de solution. Mais comment obtenir la meilleure paire (sur 4 possibilités), comment choisir la meilleure ligne droite, ...? Parce que deux solutions d'une paire différentes peuvent avoir le même score.
C'est facile. Pyth garantit un tri stable (en prenant le maximum). Je génère donc simplement les cartes dans l'ordre 2h 2s 2c 2d 3h 3s ... Ad
. Ainsi, la carte avec la valeur la plus élevée sera automatiquement le maximum.
Détails d'implémentation
=Zc
divise la chaîne d'entrée et stocke la liste des cartes Z
.
=T+`M}2Tc4"JQKA"
génère la liste des rangs ['2', ..., '10', 'J', 'Q', 'K', 'A']
et les stocke dans T
. -sM*T..."hscd"Z
génère chaque combinaison de rang avec les suites et supprime les cartes de Z
.
o...
ordonne ces cartes restantes par: lM.gPkJ
la longueur des groupes de rangs, +-4l{eMJlM
ajoute 4 - longueur (suites), +*-5l@\AN}SPMJ+NZSM.:+\AT5
ajoute 0/4/5 selon la suite (générer chaque sous-chaîne de longueur 5 de "A" + T, vérifier si la main l'un d'eux (nécessite de trier la main et de trier tous les sous-ensembles), multiplier par 5 - nombre de "A" dans la carte), _S
trie la liste décroissante.
e
choisissez le maximum et imprimez.