การจำลองการแข่งขันกรรไกรหินกระดาษ


9

คุณตัดสินใจจัดแข่งขันชิงแชมป์กรรไกรกระดาษเพื่อค้นหาว่าใครดีที่สุด คุณไม่ต้องการให้โชคดีในการตัดสินผู้ชนะดังนั้นทุกคนจะต้องให้กลยุทธ์ของเขาหรือเธอเป็นลายลักษณ์อักษรก่อนการแข่งขัน คุณชอบสิ่งที่เรียบง่ายดังนั้นการเคลื่อนไหวของคู่แข่ง (แสดงหินกระดาษหรือกรรไกร) จะต้องเป็นไปตามเทิร์นก่อนหน้าเท่านั้น (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP หรือ SvS) ในเทิร์นแรกผู้เล่นจะต้องแสดงสัญญาณคงที่

คุณตัดสินใจที่จะเขียนโปรแกรม (หรือฟังก์ชั่น) เพื่อจำลองการแข่งขันชิงแชมป์

รายละเอียดของการแข่งขัน

  • จะมีผู้แข่งขันอย่างน้อย 2 คน
  • ผู้เล่นทุกคนเล่นเกมเดียวกับทุกคน
  • นัดการแข่งขันหนึ่งรอบ 7
  • ในทุก ๆ รอบผู้ชนะจะได้รับ 2 คะแนนผู้แพ้จะไม่ได้รับ ในกรณีที่เสมอกันผู้เล่นทั้งสองทำคะแนน 1 คะแนน
  • ผู้เล่นที่ทำคะแนนในการแข่งขันคือผลรวมของคะแนนของเขาหรือเธอในรอบการแข่งขัน
  • คะแนนสุดท้ายของผู้เล่นในการแข่งขันคือคะแนนรวมของคะแนนในทุกแมทช์

รายละเอียดของอินพุต:

  • โปรแกรมหรือฟังก์ชั่นของคุณรับNสายอักขระยาว 10 ตัวซึ่งแต่ละตัวสอดคล้องกับกลยุทธ์ของผู้เล่น ตัวละครทุกตัว (ตัวพิมพ์เล็ก) r pหรือsหมายถึงว่าในสถานการณ์ที่กำหนดผู้เล่นจะแสดงกระดาษหรือกรรไกรหิน
  • อักษรตัวแรกรหัสเทิร์นแรก (ในทุกการแข่งขันสำหรับคู่แข่งนั้น) สิ่งที่สองแสดงให้เห็นว่าจะเกิดอะไรขึ้นถ้ารอบสุดท้ายเป็นหินกับหิน ตัวต่อไปคือ RvP, RvS, PvR, PvP, PvS, SvR, SvP และ SvS โดยตัวอักษรตัวแรกเป็นเครื่องหมายของผู้เล่นและอันดับที่สองคือคู่ต่อสู้ เช่นrrpsrpsrpsหมายถึงผู้เล่นเริ่มต้นด้วยหินแล้วคัดลอกการเคลื่อนไหวครั้งสุดท้ายของคู่ต่อสู้
  • คุณสามารถป้อนรายการสตริงเป็นรายการ / อาร์เรย์หรือข้อมูลที่คล้ายกันในภาษาของคุณหรือเป็นหนึ่งสตริง ในกรณีหลังจำเป็นต้องมีอักขระคั่นบางตัว

รายละเอียดของการส่งออก:

  • โปรแกรมหรือฟังก์ชั่นของคุณควรส่งออกคะแนนสุดท้ายของผู้เล่นแต่ละคนในลำดับเดียวกันกับที่ได้รับการป้อนข้อมูล
  • คะแนนควรคั่นด้วยช่องว่างหรือบรรทัดใหม่ อนุญาตให้ใช้พื้นที่ต่อท้ายหรือขึ้นบรรทัดใหม่

ตัวอย่าง:

การป้อนข้อมูล: ['rrpsrpsrps', 'rpppsprrpr']

เอาท์พุท: 5 9(ผลัดกันrvr rvp pvs svp pvr rvp pvs)

การป้อนข้อมูล: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

ผลลัพธ์: 13 17 12(การแข่งขันคือ5-9(ที่ 1 vs ที่ 2), 8-6(ที่ 1 ที่ 3 และ) 8-6(ที่ 2 ที่ 3 vs)

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ


แรงบันดาลใจจาก Numberphile? ;-)
Jakube

ตัวอย่างที่สองนั้นถูกต้องหรือไม่ ฉันคิดว่าอันที่หนึ่งจะเทียบกับตัวที่สามด้วย6-8และตัวที่สองจะ6-8หายไปกับตัวที่สามด้วย
Jakube

@Jakube อินพุตตัวอย่างที่ถูกต้อง ขอบคุณ.
Randomra

คำตอบ:


2

Python 2: 201 188 ตัวอักษร

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

ตรรกะของโปรแกรม: ฉันจะแปลงตัวอักษรไปยังหมายเลข ( r=0, p=1, s=2) mคือจำนวนของคนแรกnจำนวนของคนที่สอง เนื่องจากเกมเป็นแบบวนรอบ(m-n)%3แล้วกำหนดผลลัพธ์ และแน่นอนฉันสามารถเปลี่ยนผลลัพธ์ทีละรายการf=(m+1-n)%3ได้ ตอนนี้f=0หมายถึงผู้เล่นที่สองqชนะf=1หมายถึงการเสมอกันและf=2ผู้เล่นคนแรกpชนะ มันเป็นคะแนนสำหรับผู้เล่น 1 อยู่แล้วดังนั้นฉันแค่ต้องเพิ่มค่าทั้งหมด(p!=q)*(m+1-n)%3สำหรับผู้เล่นแต่ละคน

ทดสอบด้วย print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.