Simulatore di competizioni di rock-paper-scissors


9

Hai deciso di organizzare un campionato di rock-paper-scissors per scoprire chi è il migliore. Non vuoi lasciare la fortuna a decidere il vincitore, quindi tutti devono darti la loro tattica per iscritto prima della competizione. Ti piacciono anche le cose semplici, quindi una mossa di un concorrente (che mostra roccia, carta o forbici) deve essere basata solo sul turno precedente (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP o SvS). Nel primo turno un giocatore deve mostrare un segno fisso.

Hai deciso di scrivere un programma (o una funzione) per simulare il campionato.

Dettagli della competizione

  • Ci saranno almeno 2 concorrenti.
  • Ogni giocatore gioca esattamente una partita con tutti gli altri.
  • Una partita dura 7 round.
  • In ogni round il vincitore ottiene 2 punti, il perdente non ne ottiene nessuno. In caso di pareggio entrambi i giocatori segnano 1 punto.
  • Il punteggio di un giocatore in una partita è la somma dei suoi punti durante i turni della partita.
  • Il punteggio finale di un giocatore nel campionato è la somma dei suoi punti in tutte le partite.

Dettagli dell'input:

  • il tuo programma o funzione riceve N10 stringhe lunghe di caratteri ciascuna corrispondente a una strategia del giocatore. Tutti i personaggi sono (minuscoli) r po ssignificano che nella situazione data il giocatore mostrerà carta rock o forbici.
  • La prima lettera codifica il primo turno (in ogni partita per quel concorrente). Il secondo mostra cosa succede se l'ultimo round è stato rock vs rock. I prossimi sono RvP, RvS, PvR, PvP, PvS, SvR, SvP e SvS dove la prima lettera è il segno del giocatore e la seconda è quella dell'avversario. Ad esempio rrpsrpsrps, il giocatore inizia con il rock e quindi copia l'ultima mossa dell'avversario.
  • È possibile inserire l'elenco di stringhe come un elenco / array o dati simili della propria lingua o come una stringa. In quest'ultimo caso, una sorta di carattere separatore è d'obbligo.

Dettagli dell'output:

  • Il tuo programma o funzione dovrebbe generare i punteggi finali di ciascun giocatore nello stesso ordine in cui è stato fornito l'input.
  • I punteggi devono essere separati da spazi o righe. Spazio finale o newline consentito.

Esempi:

Ingresso: ['rrpsrpsrps', 'rpppsprrpr']

Uscita: 5 9(i giri sono rvr rvp pvs svp pvr rvp pvs)

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

Output: 13 17 12(le partite sono 5-9(1 ° vs 2 °), 8-6(1 ° vs 3 °) e 8-6(2 ° vs 3 °))

Questo è code-golf, quindi vince l'ingresso più breve.


Ispirato da Numberphile? ;-)
Jakube,

Il secondo esempio è corretto? Penso che il 1 ° perda contro il 3 ° con 6-8e il secondo perda contro il 3 ° con 6-8.
Jakube,

@Jakube Input di esempio corretto. Grazie.
randomra,

Risposte:


2

Python 2: 201 188 caratteri

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 logica del programma: a convertire le lettere per il numero ( r=0, p=1, s=2). mè il numero della prima, nil numero della seconda persona. Poiché il gioco è ciclico, (m-n)%3determina già il risultato. E, naturalmente, posso spostare il risultato di uno f=(m+1-n)%3. Ora f=0significa, il secondo giocatore qvince, f=1significa un pareggio e f=2, il primo giocatore pvince. Inoltre è già il punteggio per il giocatore 1. Quindi ho solo bisogno di aggiungere tutti i valori (p!=q)*(m+1-n)%3per ogni giocatore.

Provalo con print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.