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
N
cią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
p
lubs
co 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.
rrpsrpsrps
Oznacza, ż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.
źródło
6-8
a drugi przegrywa z trzecim z6-8
.Odpowiedzi:
Python 2:
201188 znakówLogika programu: przekonwertować listów do liczby (
r=0
,p=1
,s=2
).m
jest liczbą pierwszej,n
liczbą drugiej osoby. Ponieważ gra jest cykliczna,(m-n)%3
już określa wynik. I oczywiście mogę przesunąć wynik o jedenf=(m+1-n)%3
. Terazf=0
oznacza, że drugi graczq
wygrywa,f=1
oznacza remis, af=2
pierwszy graczp
wygrywa. Jest to również wynik dla gracza 1. Dlatego muszę tylko dodać wszystkie wartości(p!=q)*(m+1-n)%3
dla każdego gracza.Przetestuj za pomocą
print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])
źródło