Simulator kompetisi batu-kertas-gunting

9

Anda memutuskan untuk menyelenggarakan kejuaraan batu-kertas-gunting untuk mencari tahu siapa yang terbaik. Anda tidak ingin membiarkan keberuntungan untuk memutuskan pemenang sehingga setiap orang harus memberi Anda taktiknya secara tertulis sebelum kompetisi. Anda juga menyukai hal-hal sederhana sehingga perpindahan pesaing (menunjukkan batu, kertas, atau gunting) harus didasarkan hanya pada giliran sebelumnya (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP atau SvS). Pada giliran pertama seorang pemain harus menunjukkan tanda yang tetap.

Anda memutuskan untuk menulis sebuah program (atau fungsi) untuk mensimulasikan kejuaraan.

Detail kompetisi

  • Setidaknya akan ada 2 kontestan.
  • Setiap pemain memainkan tepat satu pertandingan dengan yang lainnya.
  • Satu pertandingan berlangsung 7 putaran.
  • Dalam setiap putaran, pemenang mendapat 2 poin, yang kalah tidak mendapatkan poin. Dalam hal seri kedua pemain skor 1 poin.
  • Skor seorang pemain dalam pertandingan adalah jumlah poinnya selama putaran pertandingan.
  • Skor akhir pemain di kejuaraan adalah jumlah poinnya di semua pertandingan.

Detail input:

  • program atau fungsi Anda menerima N10 karakter string panjang yang masing-masing sesuai dengan strategi pemain. Semua karakter (huruf kecil) r patau sartinya dalam situasi tertentu pemain akan menunjukkan kertas batu atau gunting.
  • Huruf pertama memberi kode giliran pertama (dalam setiap pertandingan untuk pesaing itu). Yang kedua menunjukkan apa yang terjadi jika babak terakhir adalah rock vs rock. Yang berikutnya adalah RvP, RvS, PvR, PvP, PvS, SvR, SvP dan SvS di mana huruf pertama adalah tanda pemain dan yang kedua adalah tanda lawan. Misalnya rrpsrpsrpsberarti pemain mulai dengan batu dan kemudian menyalin gerakan terakhir lawan.
  • Anda dapat memasukkan daftar string sebagai daftar / larik atau data serupa bahasa Anda atau sebagai satu string. Dalam kasus terakhir beberapa jenis karakter pemisah adalah suatu keharusan.

Rincian output:

  • Program atau fungsi Anda harus menampilkan skor akhir dari setiap pemain dalam urutan yang sama dengan input yang diberikan.
  • Skor harus dipisahkan oleh spasi atau baris baru. Ruang tambahan atau baris baru diizinkan.

Contoh:

Memasukkan: ['rrpsrpsrps', 'rpppsprrpr']

Output: 5 9(ternyata rvr rvp pvs svp pvr rvp pvs)

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

Output: 13 17 12(pertandingan adalah 5-9(1 vs 2), 8-6(1 vs 3) dan 8-6(2 vs 3))

Ini adalah kode-golf sehingga entri terpendek menang.

randomra
sumber
Terinspirasi oleh Numberphile? ;-)
Jakube
Apakah contoh kedua benar? Saya pikir yang pertama kalah melawan yang ke-3 dengan 6-8dan yang kedua kalah dengan yang ketiga 6-8.
Jakube
@Jakube Masukan contoh terkoreksi. Terima kasih.
randomra

Jawaban:

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

Logika program: saya mengkonversi huruf ke nomor ( r=0, p=1, s=2). madalah nomor yang pertama, njumlah orang kedua. Karena game ini bersifat siklik, (m-n)%3sudah menentukan hasilnya. Dan tentu saja, saya dapat mengubah hasilnya satu per satu f=(m+1-n)%3. Sekarang f=0berarti, pemain kedua qmenang, f=1berarti seri, dan f=2, pemain pertama pmenang. Itu juga sudah menjadi skor untuk pemain 1. Karena itu saya hanya perlu menambahkan semua nilai (p!=q)*(m+1-n)%3untuk setiap pemain.

Uji dengan print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

Jakube
sumber