Simulateur de compétition Rock-Paper-Scissors

9

Vous avez décidé d'organiser un championnat rock-paper-ciseaux pour découvrir qui est le meilleur. Vous ne voulez pas laisser la chance décider du vainqueur, donc tout le monde doit vous donner sa tactique par écrit avant la compétition. Vous aimez aussi les choses simples, donc un mouvement d'un compétiteur (montrant de la roche, du papier ou des ciseaux) doit être basé uniquement sur le tour précédent (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP ou SvS). Au premier tour, un joueur doit montrer un signe fixe.

Vous avez décidé d'écrire un programme (ou une fonction) pour simuler le championnat.

Détails du concours

  • Il y aura au moins 2 candidats.
  • Chaque joueur joue exactement un match avec tout le monde.
  • Un match dure 7 tours.
  • À chaque tour, le gagnant obtient 2 points, le perdant n'en obtient aucun. En cas d'égalité, les deux joueurs marquent 1 point.
  • Un joueur marque dans un match est la somme de ses points sur les tours du match.
  • Le score final d'un joueur au championnat est la somme de ses points sur tous les matchs.

Détails de l'entrée:

  • votre programme ou fonction reçoit N10 chaînes de caractères longues chacune correspondant à une stratégie de joueurs. Tous les personnages sont en minuscules r pou ssignifient que dans la situation donnée, le joueur montrera du papier de roche ou des ciseaux.
  • La première lettre code le premier tour (dans chaque match pour ce compétiteur). La seconde montre ce qui se passe si le dernier tour était rock vs rock. Les suivants sont RvP, RvS, PvR, PvP, PvS, SvR, SvP et SvS où la première lettre est le signe du joueur et la seconde celle de l'adversaire. Par exemple rrpsrpsrps, le joueur commence par le rock puis copie le dernier coup de l'adversaire.
  • Vous pouvez saisir la liste des chaînes sous forme de liste / tableau ou de données similaires de votre langue ou sous forme d'une seule chaîne. Dans ce dernier cas, une sorte de caractère séparateur est indispensable.

Détails de la sortie:

  • Votre programme ou fonction doit produire les scores finaux de chaque joueur dans le même ordre que l'entrée a été fournie.
  • Les partitions doivent être séparées par des espaces ou des retours à la ligne. L'espace de fin ou la nouvelle ligne est autorisé.

Exemples:

Contribution: ['rrpsrpsrps', 'rpppsprrpr']

Sortie: 5 9(les tours sont rvr rvp pvs svp pvr rvp pvs)

Contribution: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

Sortie: 13 17 12(les matchs sont 5-9(1er vs 2ème), 8-6(1er vs 3ème) et 8-6(2ème vs 3ème))

Il s'agit de code-golf, donc l'entrée la plus courte gagne.

randomra
la source
Inspiré par Numberphile? ;-)
Jakube
Le deuxième exemple est-il correct? Je pense que le 1er perd contre le 3e avec 6-8et le second perd contre le troisième avec 6-8.
Jakube
@Jakube Exemple d'entrée corrigé. THX.
randomra

Réponses:

2

Python 2: 201 188 caractères

def f(Q):c=lambda m:'rps'.index(m);l=len(Q);r=[0]*l;i=0;exec'p,q=i/l,i%l;m,n=c(Q[p][0]),c(Q[q][0]);exec"r[p]+=(p!=q)*(m+1-n)%3;m,n=c(Q[p][m*3+n+1]),c(Q[q][n*3+m+1]);"*7;i+=1;'*l*l;return r

La logique du programme: je convertir les lettres au numéro ( r=0, p=1, s=2). mest le numéro de la première, nle numéro de la deuxième personne. Parce que le jeu est cyclique, (m-n)%3détermine déjà le résultat. Et bien sûr, je peux décaler le résultat d'un f=(m+1-n)%3. Désormais, f=0signifie que le deuxième joueur qgagne, f=1signifie une égalité et que le f=2premier joueur pgagne. C'est aussi déjà le score du joueur 1. Par conséquent, je n'ai qu'à ajouter toutes les valeurs (p!=q)*(m+1-n)%3pour chaque joueur.

Testez-le avec print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
la source