Rock-Paper-Scissors-Wettbewerbssimulator

9

Sie haben beschlossen, eine Stein-Papier-Scheren- Meisterschaft zu organisieren, um herauszufinden, wer der Beste ist. Sie möchten nicht das Glück haben, den Gewinner zu bestimmen, daher muss jeder Ihnen seine Taktik vor dem Wettbewerb schriftlich mitteilen. Sie mögen auch einfache Dinge, so dass eine Bewegung eines Konkurrenten (mit Stein, Papier oder Schere) nur auf der vorherigen Runde basieren muss (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP oder SvS). In der ersten Runde muss ein Spieler ein festes Zeichen zeigen.

Sie haben beschlossen, ein Programm (oder eine Funktion) zu schreiben, um die Meisterschaft zu simulieren.

Details des Wettbewerbs

  • Es werden mindestens 2 Teilnehmer sein.
  • Jeder Spieler spielt genau ein Match mit allen anderen.
  • Ein Match dauert 7 Runden.
  • In jeder Runde erhält der Gewinner 2 Punkte, der Verlierer keine. Bei einem Unentschieden erhalten beide Spieler 1 Punkt.
  • Die Punktzahl eines Spielers in einem Spiel ist die Summe seiner Punkte über die Runden des Spiels.
  • Das Endergebnis eines Spielers in der Meisterschaft ist die Summe seiner Punkte über alle Spiele.

Details der Eingabe:

  • Ihr Programm oder Ihre Funktion erhält N10 Zeichen lange Zeichenfolgen, von denen jede einer Spielerstrategie entspricht. Alle Zeichen sind (Kleinbuchstaben) r poder sbedeuten, dass der Spieler in der gegebenen Situation Steinpapier oder eine Schere zeigt.
  • Der erste Buchstabe kodiert die erste Runde (in jedem Spiel für diesen Teilnehmer). Die zweite zeigt, was passiert, wenn die letzte Runde Rock gegen Rock war. Die nächsten sind RvP, RvS, PvR, PvP, PvS, SvR, SvP und SvS, wobei der erste Buchstabe das Zeichen des Spielers und der zweite das Zeichen des Gegners ist. ZB rrpsrpsrpsbedeutet, dass der Spieler mit Stein beginnt und dann den letzten Zug des Gegners kopiert.
  • Sie können die Liste der Zeichenfolgen als Liste / Array oder ähnliche Daten Ihrer Sprache oder als eine Zeichenfolge eingeben. Im letzteren Fall ist eine Art Trennzeichen ein Muss.

Details der Ausgabe:

  • Ihr Programm oder Ihre Funktion sollte die Endergebnisse jedes Spielers in derselben Reihenfolge ausgeben, in der die Eingabe geliefert wurde.
  • Scores sollten durch Leerzeichen oder Zeilenumbrüche getrennt werden. Leerzeichen oder Zeilenumbrüche sind zulässig.

Beispiele:

Eingang: ['rrpsrpsrps', 'rpppsprrpr']

Ausgabe: 5 9(Umdrehungen sind rvr rvp pvs svp pvr rvp pvs)

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

Ausgabe: 13 17 12(Übereinstimmungen sind 5-9(1. gegen 2.), 8-6(1. gegen 3.) und 8-6(2. gegen 3.))

Dies ist Code-Golf, also gewinnt der kürzeste Eintrag.

randomra
quelle
Inspiriert von Numberphile? ;-)
Jakube
Ist das zweite Beispiel richtig? Ich denke, der 1. verliert gegen den 3. mit 6-8und der zweite verliert gegen den dritten mit 6-8.
Jakube
@Jakube Beispieleingabe korrigiert. Vielen Dank.
Randomra

Antworten:

2

Python 2: 201 188 Zeichen

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

Die Logik des Programms: Ich konvertiere die Buchstaben Nummer ( r=0, p=1, s=2). mist die Nummer der ersten, ndie Nummer der zweiten Person. Da das Spiel zyklisch ist, (m-n)%3bestimmt sich bereits das Ergebnis. Und natürlich kann ich das Ergebnis um eins verschieben f=(m+1-n)%3. Bedeutet nun f=0, dass der zweite Spieler qgewinnt, f=1ein Unentschieden bedeutet und der f=2erste Spieler pgewinnt. Es ist auch bereits die Punktzahl für Spieler 1. Daher muss ich nur alle Werte (p!=q)*(m+1-n)%3für jeden Spieler hinzufügen .

Testen Sie es mit print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
quelle