剪刀石头布比赛模拟器


9

您决定组织一次剪刀石头布冠军赛,以找出谁是最好的。您不想让运气来决定获胜者,所以每个人都必须在比赛前以书面形式给您提供战术。您还喜欢简单的事物,因此竞争对手的举动(显示石头,纸张或剪刀)必须仅基于前一轮(RvR,RvP,RvS,PvR,PvP,PvS,SvR,SvP或SvS)。在第一轮中,玩家必须显示一个固定的标志。

您决定编写一个程序(或函数)来模拟锦标赛。

比赛详情

  • 至少有2位参赛者。
  • 每个玩家都与其他人完全进行一场比赛。
  • 一场比赛持续7回合。
  • 在每个回合中,获胜者获得2分,失败者获得2分。如果出现平局,双方选手得分均为1分。
  • 一名球员在一场比赛中的得分是他或她在比赛回合中得分的总和。
  • 球员在锦标赛中的最终得分是他或她在所有比赛中的积分之和。

输入的详细信息:

  • 您的程序或函数会收到N10个字符长的字符串,每个字符串都对应一个玩家策略。所有字符均为(小写)r ps表示在给定情况下玩家将显示石头纸或剪刀。
  • 第一个字母代表第一个回合(在该运动员的每场比赛中)。第二个显示如果上一轮是摇滚对摇滚,会发生什么。接下来的是RvP,RvS,PvR,PvP,PvS,SvR,SvP和SvS,其中第一个字母是玩家的牌子,第二个字母是对手的牌子。例如,rrpsrpsrps意味着玩家从岩石开始,然后复制对手的最后一步。
  • 您可以将字符串列表输入为列表/数组或您的语言的类似数据或一个字符串。在后一种情况下,必须使用某种分隔符。

输出的详细信息:

  • 您的程序或函数应按照提供输入的顺序输出每个玩家的最终得分。
  • 分数应以空格或换行符分隔。允许使用尾随空格或换行符。

例子:

输入: ['rrpsrpsrps', 'rpppsprrpr']

输出:( 5 9rvr rvp pvs svp pvr rvp pvs

输入: ['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']

输出:( 13 17 12匹配项是5-9(第一对第二),8-6(第一对第三)和8-6(第二对第三))

这是代码高尔夫球,因此最短的条目将获胜。


受到Numberphile的启发吗?;-)
Jakube 2015年

第二个例子正确吗?我认为第一个与第三6-8个相对较差,第二个与相对较弱6-8
2015年

@Jakube已更正示例输入。谢谢。
randomra

Answers:


2

蟒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=0p=1s=2)。m是第一个人n的人数,第二个人的人数。由于游戏是循环的,因此(m-n)%3已经确定了结果。当然,我可以将结果移位1 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'])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.