Dans un tour de dilemme du prisonnier , deux joueurs décident chacun de coopérer ou de faire défaut pour ce tour. Le score pour une manche est:
- Le joueur A et le joueur B coopèrent: 1 point pour les deux
- Le joueur A et le joueur B ont tous deux un défaut: 2 points pour les deux
- Le joueur A coopère et le joueur B fait défaut: 3 points pour le joueur coopérant A et 0 point pour le joueur B défectueux
Cependant, vous n'avez pas à vous soucier de la stratégie: votre programme ne fera que tabuler le score d'un match. (Si vous connaissez déjà le dilemme du prisonnier, mes "points" correspondent ici à "des années de prison.")
Votre défi est de prendre des informations qui représentent les choix des joueurs sur plusieurs tours et de calculer leurs scores totaux respectifs. Un joueur soumet des choix en minuscules c
et d
(pour coopérer et faire défaut ), et l'autre soumet des choix en majuscules, C
et D
. Ces choix sont fournis à votre programme sous forme de chaîne.
Normalement, les joueurs dans le dilemme du prisonnier soumettent leurs coups simultanément et de manière itérative. Dans ce défi, cependant, les joueurs peuvent avoir soumis leurs choix pour plusieurs tours à la fois. Si le coup d'un joueur est hors séquence, le programme de pointage s'en souvient et le fait correspondre avec le prochain coup disponible du joueur adverse.
Voici un exemple de chaîne d'entrée:
cDCddDDCcCc
Pour afficher les correspondances qui existent dans cette entrée, je vais appeler séparément les minuscules et les majuscules et les associer:
cDCddDDCcCc
c dd c c => cddcc
DC DDC C => DCDDCC
Ceux-ci seront jumelés dans les tours:
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
d vs C (0 pts for lowercase-player, 3 pts for uppercase-player)
d vs D (2 pts for both)
c vs D (3 pts for lowercase-player, 0 pts for uppercase-player)
c vs C (1 pt for both)
Qui produit le score 9
(en minuscules) à 6
(en majuscules), donc la sortie doit être 9,6
(ou tout délimiteur sans ambiguïté).
Pour l'exprimer d'une autre manière, voici chaque paire tirée sur sa propre rangée:
cDCddDDCcCc
cD
Cd
dD
D c
C c
Il y en a un inégalé C
, car le joueur majuscule a soumis plus de coups que le joueur minuscule. C'est acceptable et il est totalement ignoré à des fins de notation.
Voici les prérequis:
Vous devez écrire un programme ou une fonction qui accepte une chaîne de la forme d'expression régulière
/[cdCD]+/
, via un mécanisme d'entrée (STDIN, argument de fonction, lecture à partir d'un fichier, etc.). (Votre programme peut éventuellement accepter une entrée avec une nouvelle ligne de fin.)Votre programme ou fonction doit produire ou renvoyer les scores des joueurs sous forme de chaîne. Le format de sortie doit commencer par le score du joueur en minuscules, suivi du score du joueur en majuscules, séparé par tout délimiteur non vide et non numérique de votre choix. (Une nouvelle ligne de fin est facultative.)
Si un joueur a plus de coups que l'autre, les coups excédentaires sont ignorés.
Si tous les coups dans l'entrée proviennent d'un seul joueur (c'est-à-dire qu'aucun tour n'a été joué du tout), alors le score de chaque joueur est
0
.La plus petite soumission en octets gagne.
Cas de test
Input: cDCddDDCcCc
Output: 9,6 -- or any delimiter; I chose commas here
Input: cccDDD
Output: 9,0
Input: DDDDDDccc
Output: 9,0
Input: cDcDcD
Output: 9,0
Input: dcDDC
Output: 5,2
Input: CcdCDDcd
Output: 6,6
Input: Ddd
Output: 2,2
Input: ccccccccccc
Output: 0,0
(0,0)
ou[0,0]
OK pour la sortie?Réponses:
Pyth, 23 octets
Suite de tests
Explication:
@Gz
: Minuscules-zG
: Lettres capitalesC,
: Jumeler, tronquer le reste.`
: Prendre la représentation sous forme de chaîne de la liste des paires/L ... "cDDCdd
: Pour chaque lettre"cDDCdd"
, comptez combien de fois elle apparaît dans la chaîne ci-dessus repr.c2
: Coupez la liste résultante en deux.sM
: Additionnez chaque moitié.j
: Rejoignez les nouvelles lignes et imprimez.`doit être utilisé à la place de s pour faire en sorte qu'une partie ne joue jamais.
la source
Haskell,
139134 octetsExemple d'utilisation:
f "cDCddDDCcCc"
->"9,6"
15 octets juste pour obtenir le bon format de sortie, c'est-à-dire transformer une paire de nombres
(x,y)
en une chaîne"x,y"
.Comment ça fonctionne:
Edit: @Zgarb m'a aidé à économiser 5 octets. Merci!
la source
LabVIEW, 77 octets
Le code scanne à partir des jetons et utilise ces indices pour décider où vont les points.
Le décompte va comme ça
la source
Python 3, 110
5 octets enregistrés grâce à FryAmTheEggman.
Économisé 7 octets grâce aux apsillers.
Économie de 26 octets grâce à DSM.
Je pense que tout est finalement joué.
Il parcourt chaque caractère de l'entrée et le trie selon qu'il est en majuscules ou non. Il fait ensuite quelques calculs fantaisistes qui abusent de la conversion implicite de Python de bools en ints.
la source
JavaScript (ES6),
124118 octetsDémo en direct
(Développé légèrement pour plus de lisibilité.)
6 octets enregistrés grâce à user81655 .
la source
Par , 49 octets
Un octet est utilisé par caractère. Voyez ici .
Explication
Sorties dans le formulaire
9 6
.la source
CJam,
928381 octetsCela a fini plus longtemps que je ne le pensais ...
Essayez-le ici.
Explication (Oserais-je expliquer cela?: O):
la source