Taş-kağıt-makas rekabet simülatörü


9

Kimin en iyi olduğunu bulmak için bir taş-kağıt-makas şampiyonası düzenlemeye karar verdiniz . Kazanana karar vermek için şansa izin vermek istemezsiniz, bu yüzden herkes yarışmadan önce size yazılı olarak taktiğini vermek zorundadır. Basit şeyleri de seversiniz, bu yüzden bir rakibin (kaya, kağıt veya makas gösterme) hareketi sadece önceki dönüşe (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP veya SvS) dayanmalıdır. İlk sırada bir oyuncu sabit bir işaret göstermek zorundadır.

Şampiyonayı simüle etmek için bir program (veya işlev) yazmaya karar verdiniz.

Yarışmanın ayrıntıları

  • En az 2 yarışmacı olacaktır.
  • Her oyuncu diğer herkesle tam olarak bir maç oynar.
  • Bir maç 7 tur sürer.
  • Her turda kazanan 2 puan alır, kaybeden hiçbir puan kazanmaz. Beraberlik durumunda her iki oyuncu da 1 puan alır.
  • Bir maçtaki oyuncuların puanı, maçın dönüşlerindeki puanlarının toplamıdır.
  • Bir şampiyonada bir oyuncunun final skoru, tüm maçlardaki puanlarının toplamıdır.

Giriş detayları:

  • programınız veya işleviniz, Nher biri bir oyuncu stratejisine karşılık gelen 10 karakter uzunluğunda dizeler alır . Tüm karakterler (küçük harf) r pveya sverilen durumda oyuncunun taş kağıt veya makas göstereceği anlamına gelir.
  • İlk harf ilk dönüşü kodlar (bu yarışmacı için her maçta). İkincisi, son tur kayaya karşı kaya olsaydı ne olacağını gösterir. Bir sonraki olanlar RvP, RvS, PvR, PvP, PvS, SvR, SvP ve SvS'dir; burada ilk harf oyuncunun işareti ve ikincisi rakibin işaretidir. Örneğin rrpsrpsrps, oyuncunun rock ile başladığı ve sonra rakibin son hamlesini kopyaladığı anlamına gelir.
  • Dize listesine bir liste / dizi veya dilinizin benzer verileri veya bir dize olarak girebilirsiniz. İkinci durumda, bir tür ayırıcı karakter bir zorunluluktur.

Çıktının ayrıntıları:

  • Programınız veya fonksiyonunuz, her oyuncunun final skorlarını, giriş verildiği sırayla çıkarmalıdır.
  • Skorlar boşluk veya satırsonu ile ayrılmalıdır. Sondaki boşluk veya yeni satıra izin verilir.

Örnekler:

Giriş: ['rrpsrpsrps', 'rpppsprrpr']

Çıktı: 5 9(dönüşler rvr rvp pvs svp pvr rvp pvs)

Giriş: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

Çıktı: 13 17 12(maçlar 5-9(1. - 2.), 8-6(1. - 3.) ve 8-6(2. - 3.))

Bu kod golf bu yüzden en kısa giriş kazanır.


Numberphile'dan ilham alıyor musunuz? ;-)
Jakube

İkinci örnek doğru mu? Bence 1'inci 3'lü ile 6-8kaybeder, 2'nci 3'lü ile kaybeder 6-8.
Jakube

@ Jakube Düzeltilmiş örnek girişi. Teşekkür.
randomra

Yanıtlar:


2

Python 2: 201 188 karakter

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

Programın mantığı: Ben sayıya harfleri dönüştürmek ( r=0, p=1, s=2). milki nsayısı, ikincisi sayısıdır. Oyun döngüsel olduğundan, (m-n)%3sonucu zaten belirler. Ve elbette, sonucu birer birer değiştirebilirim f=(m+1-n)%3. Şimdi f=0, ikinci oyuncu qkazanır, f=1berabere kalır ve f=2ilk oyuncu pkazanır. Aynı zamanda oyuncu 1'in skoru zaten (p!=q)*(m+1-n)%3.

Şununla test et: print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.