Symulator zawodów papier-kamień-nożyce

9

Zdecydowałeś się zorganizować mistrzostwo w papierach z kamienia, aby dowiedzieć się, kto jest najlepszy. Nie chcesz, aby szczęście decydowało o zwycięstwie, więc każdy musi przed rozpoczęciem zawodów podać swoją taktykę na piśmie. Lubisz także proste rzeczy, więc ruch konkurenta (pokazujący kamień, papier lub nożyczki) musi opierać się tylko na poprzedniej turze (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP lub SvS). W pierwszej turze gracz musi pokazać stały znak.

Zdecydowałeś się napisać program (lub funkcję) do symulacji mistrzostw.

Szczegóły konkursu

  • Będzie co najmniej 2 zawodników.
  • Każdy gracz rozgrywa dokładnie jeden mecz ze wszystkimi innymi.
  • Jeden mecz trwa 7 rund.
  • W każdej rundzie zwycięzca otrzymuje 2 punkty, a przegrany nie otrzymuje. W przypadku remisu obaj gracze zdobywają 1 punkt.
  • Wynik gracza w meczu to suma jego punktów w ciągu rundy meczu.
  • Końcowy wynik zawodników w mistrzostwach jest sumą jego punktów za wszystkie mecze.

Szczegóły wkładu:

  • twój program lub funkcja otrzymuje Nciąg znaków o długości 10 znaków, z których każdy odpowiada strategii gracza. Wszystkie znaki są (małe litery) r plub sco oznacza, że w danej sytuacji gracz pokaże papier rock lub nożyczek.
  • Pierwsza litera oznacza pierwszą turę (w każdym meczu tego zawodnika). Druga pokazuje, co się stanie, jeśli ostatnia runda był rockiem przeciwko rockowi. Kolejne to RvP, RvS, PvR, PvP, PvS, SvR, SvP i SvS, gdzie pierwsza litera to znak gracza, a druga to znak przeciwnika. Np. rrpsrpsrpsOznacza, że ​​gracz zaczyna od skały, a następnie kopiuje ostatni ruch przeciwnika.
  • Możesz wpisać listę ciągów jako listę / tablicę lub podobne dane swojego języka lub jako jeden ciąg. W tym drugim przypadku konieczny jest jakiś znak separatora.

Szczegóły wyniku:

  • Twój program lub funkcja powinna wyświetlać końcowe wyniki każdego gracza w tej samej kolejności, w jakiej podano dane wejściowe.
  • Wyniki powinny być oddzielone spacjami lub znakami nowej linii. Dopuszczalna jest spacja lub znak nowej linii.

Przykłady:

Wejście: ['rrpsrpsrps', 'rpppsprrpr']

Wyjście: 5 9(zwoje są rvr rvp pvs svp pvr rvp pvs)

Wejście: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

Wyjście: 13 17 12(mecze to 5-9(1. vs 2.), 8-6(1. vs 3.) i 8-6(2. vs 3.)

To jest golf golfowy, więc wygrywa najkrótszy wpis.

randomra
źródło
Zainspirowany Numberphile? ;-)
Jakube
Czy drugi przykład jest poprawny? Myślę, że pierwszy przegrywa z trzecim z, 6-8a drugi przegrywa z trzecim z 6-8.
Jakube,
@Jakube Poprawione przykładowe wejście. Dzięki.
randomra

Odpowiedzi:

2

Python 2: 201 188 znaków

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

Logika programu: przekonwertować listów do liczby ( r=0, p=1, s=2). mjest liczbą pierwszej, nliczbą drugiej osoby. Ponieważ gra jest cykliczna, (m-n)%3już określa wynik. I oczywiście mogę przesunąć wynik o jeden f=(m+1-n)%3. Teraz f=0oznacza, że ​​drugi gracz qwygrywa, f=1oznacza remis, a f=2pierwszy gracz pwygrywa. Jest to również wynik dla gracza 1. Dlatego muszę tylko dodać wszystkie wartości (p!=q)*(m+1-n)%3dla każdego gracza.

Przetestuj za pomocą print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
źródło