J'aime les défis des jeux de cartes, j'ai donc fait celui-ci pour le jeu de cartes italien Scopa. Ma famille joue à ce jeu depuis des temps immémoriaux. Il a un système de notation très intéressant qui devrait être amusant pour le golf. Je vais poster une réponse en R pour commencer le plaisir, que je suis sûr que les gens vont améliorer.
Le défi: déterminer le nombre de points marqués lors d'une manche de Scopa, compte tenu des cartes saisies par le joueur lors de la manche.
Il y a 40 cartes dans un paquet Scopa. Si vous utilisez un deck international, vous supprimez les 8, 9 et 10, laissant A, 2,3,4,5,6,7, Q, J, K dans chaque combinaison. 1 Il y a deux joueurs ou partenariats, et après chaque tour, toutes les cartes sont capturées par l'un ou l'autre des deux joueurs. Le score est compté comme suit (plus d'informations ici ):
- Le joueur avec le plus de cartes marque 1 point.
- Le joueur avec le plus de diamants (ou de pièces s'il utilise le deck italien) marque 1 point.
- Le joueur avec le 7 de diamants (ou pièces), connu sous le nom de sette bello ou beautiful seven, marque 1 point.
- Le joueur avec la primiera la plus élevée marque 1 point. Le score primiera d' un joueur est la somme des scores de la carte de la plus haute valeur que le joueur a capturée dans chaque couleur (voir tableau ci-dessous). Si vous n'avez pas au moins une carte dans chaque couleur, vous perdez par défaut même si votre score dépasse le score de votre adversaire. Dans le cas extrêmement rare où aucun joueur n'a au moins une carte dans chaque couleur , le joueur avec le total de primiera le plus élevé marque le point. 2
Tableau des scores primiera
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Ainsi, un joueur peut marquer au plus 4 points dans un tour. 3 S'il y a une cravate, ce qui est possible pour les cartes, les diamants ou les primiera , personne ne marque le point.
Il est important de réaliser que puisque chaque carte doit être capturée par l'un des deux joueurs, vous pouvez déduire quelles cartes l'autre joueur doit avoir prises même si vous ne savez que quelles cartes un joueur a prises. Vous devrez le faire pour marquer correctement primiera .
Règles du challenge
Contribution
Votre code doit prendre en entrée les cartes capturées par un seul joueur lors d'une manche de Scopa.
L'entrée doit être au format chaîne, dans laquelle un caractère représente le rang de chaque carte et un caractère sa couleur. Cela supprime la faille potentielle de passer lesscores primiera directement en entrée. La conversion des classements de cartes en scores primiera doit être effectuée dans le programme. Cependant, vous pouvez choisir d'utiliser une seule chaîne séparée par des espaces ou des virgules, un tableau de chaînes ou tout autre format. Par exemple, si vous choisissez de coder les rangs comme76A5432QJK
et convient,DCHS
vous pouvez utiliser des entrées telles que['7D', '6H', 'QD', 'JS']
ou'7D,6H,QD,JS'
.
Production
Un entier de 0 à 4 représentant le score du joueur.
Gagnant
La réponse la plus courte en octets gagne!
Cas de test
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Scores 4 : 1 point pour> 20 cartes, 1 point pour> 5 diamants, 1 point pour les 7 diamants et 1 point pour avoir marqué 78 en primiera (7,7,7,5 où l'adversaire a 7,6,5, K pour 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Scores 0 : <= 20 cartes, <= 5 diamants, pas 7 de diamants, et ne marque que 69 en primiera (7,7,4,3 où l'adversaire a 7,7,6, K pour 70)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Scores 3 : 1 point pour> 20 cartes, 1 point pour> 5 diamants, 1 point pour 7 diamants. La primiera serait de 63 (7,7,7) et l'adversaire ne peut marquer que 51 (7, Q, Q, Q) mais comme cette main n'a pas de pique, elle perd le point par défaut.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Scores 3 : <= 20 cartes, 1 point pour> 5 diamants, 1 point pour 7 diamants. La primiera ne marque que 51 (7, Q, Q, Q) et l'adversaire peut marquer 63 (7,7,7) mais comme la main de l'adversaire n'a pas de diamants, cette main gagne le point primiera par défaut.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Scores 3 : <= 20 cartes, 1 point pour> 5 diamants, 1 point pour 7 diamants. Même si cette main n'a pas de pique, elle gagne toujours primiera par un score de 63 à 57 (7,7,7 contre 7,6,6) car la main de l'adversaire n'a pas de diamant.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Scores 2 : <= 20 cartes, 1 point pour> 5 diamants, 1 point pour 7 diamants. Cette main n'a pas de pique et la main de l'adversaire n'a pas de diamant. L'adversaire remporte la primiera par un score de 63 à 41 (7,7,7 contre 7, Q, Q).
[]
(tableau vide)
Scores 0
1: Au moins dans notre famille, Jack devance Queen dans Scopa, mais cela n'est pas pertinent pour les buts.
2: Je joue à ce jeu depuis mon enfance et je n'ai jamais vu cela se produire, mais votre code devrait mieux gérer cette affaire!
3: Il y a des points bonus pour les "balayages" marqués pendant le tour que j'ignore dans le cadre de ce défi.
la source
Réponses:
Ruby,
156153 bytesEssayez-le en ligne!
Cela utilise
;865432000
pour représenter76A5432QJK
respectivement, et les combinaisons sont en minuscules. (Le choix des caractères est dû au fait que la soustraction de 38 à chacun donne leur valeur primiera, mais nous ne le faisons jamais réellement parce que seule la différence relative compte.)Nous ne vérifions pas s'il manque un costume à l'un ou l'autre des joueurs car cela n'est pas nécessaire - puisque toutes les cartes sont comptées comme 38 plus leur valeur réelle, si quelqu'un manque un costume, le score le plus élevé qu'il peut obtenir est (21 + 38) * 3 = 177, ce qui est inférieur à (10 + 38) * 3 + 21 + 38 = 203, le score le plus bas que l'autre joueur puisse obtenir. Nous ne pouvons pas laisser les deux joueurs manquer un nombre de combinaisons différent de zéro, car un joueur ne peut manquer que 0, 1 ou 2 combinaisons, et si quelqu'un manque 2 combinaisons, il a toutes les cartes des 2 autres combinaisons.
la source
R,
320298265238229224211209179 octetsC'est une solution principalement due à @digEmAll, sous la forme d'une fonction.
Essayez-le en ligne!
Ci-dessous est le meilleur de mes anciennes tentatives médiocres pour 209 octets.
edit: joué au golf en aliasant certaines fonctions, puis en prenant l'idée de Doorknob d'ajouter une constante au score au lieu de vérifier les combinaisons.
prochaine édition: débarrassé de certaines redondances, puis incorporé quelques améliorations de Giuseppe
prochaine édition: -2 octets grâce à digEmAll
Je suis horrible à ce sujet, donc je suis sûr que quelqu'un peut améliorer cela s'il veut prendre le temps. Je me sens comme
sapply
et je suisfunction
super longue et je pourrais m'en débarrasser mais je ne sais pas comment. Les entrées sont des chaînes de deux caractères dans la notation standard.la source
JavaScript (ES6),
171163 octetsPrend l'entrée comme un ensemble de cartes, en utilisant leur représentation standard.
Essayez-le en ligne!
Commenté
la source
05AB1E , 41 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Les costumes
DCHS
sont respectivement représentés par0123
. Les rangs7A65432KJQ
sont respectivement représentés par0123456789
. Celles-ci sont prises comme des chaînes, pas des entiers, comme requis par le défi (mais ensuite 05AB1E les convertit en entiers quand c'est nécessaire).Comme dans les autres solutions, nous ajoutons une grande constante (14) à chaque score primiera afin de rendre inutile la vérification des combinaisons manquantes.
la source
MS SQL Server 2017 , 525 octets
Essayez-le sur db <> violon .
la source
Retina 0.8.2 , 334 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Créez une liste des 40 cartes.
Retirez les cartes que le joueur détient.
Remplacez chaque rang par son ordre de tri, qui est de 9 pour
7
et 10 de moins que sa valeur pour les autres cartes.Triez les cartes par couleur et rang.
Comptez le nombre de cartes dans chaque couleur et capturez également la carte la mieux classée dans chaque couleur, capturant le diamant le plus élevé deux fois.
Vérifiez si le diamant le plus élevé était le 7.
Supprimez toutes les cartes les plus élevées si l'une des combinaisons n'a pas de cartes.
Convertissez les cartes les plus élevées en leur score unaire et additionnez-les. Convertissez également le nombre total de cartes et de longueurs de costume en unaire.
Marquez des points si le total, diamants ou primiera, est plus élevé.
Faites le total du score.
la source
C # (Visual C # Interactive Compiler) , 193 octets
Essayez-le en ligne!
la source
AWK , 235 octets
Essayez-le en ligne!
La carte convient à 1234 (4 correspond aux diamants), la valeur correspond à 0123456789. Ce programme transforme les cas de test au format accepté:
Mon objectif était juste de battre l'implémentation Python leader: D
la source
Python 3 ,
249 245 239238 octets-4 octets grâce à @ovs
-6 octets grâce à @movatica
Essayez-le en ligne!
la source
int('0734569c00'[int(x[0])],13)
etif x[1]<'E'
peut être écrit commeif'E'>x[1]
all(s in''.join(C)for s in S)
peut être raccourci ennot S.strip(''.join(C))
économisant 6 octets