银河出逃时 2021-07-15 18:43 采纳率: 85.7%
浏览 20
已采纳

简单Python代码不理解

一个投骰子的游戏,投五次,对应得分如下
1,1,1 => 1000 points
6,6,6 => 600 points
5,5,5 => 500 points
4,4,4 => 400 points
3,3,3 => 300 points
2,2,2 => 200 points
1 => 100 points
5 => 50 point

Throw       Score
 ---------   ------------------------------------------------
 5 1 3 4 1   250:  50 (for the 5) + 2 * 100 (for the 1s)
 1 1 1 3 1   1100: 1000 (for three 1s) + 100 (for the other 1)
 2 4 4 5 4   450:  400 (for three 4s) + 50 (for the 5)

第二个for循环不理解

def score(dice):
    sum = 0
    counter = [0, 0, 0, 0, 0, 0]
    points = [1000, 200, 300, 400, 500, 600]
    extra = [100, 0, 0, 0, 50, 0]
    for die in dice:
        counter[die - 1] += 1
    for (i, count) in enumerate(counter):
        sum += (points[i] if count >= 3 else 0) + extra[i] * (count % 3)
    return sum
print(score([5, 1, 3, 4, 1]))
  • 写回答

2条回答 默认 最新

  • 八云黧 2021-07-15 20:53
    关注

    积分规则有两条:一是按出现3次的数字积不同的分,二是按刨除前三个数字后剩下的1或5积不同的分。
    这个函数设计了3个列表,counter储存1-6的出现次数(但由于数组从0开始所以是0-5),point储存1-6对应的规则一得分,extra储存对应的规则二得分。
    所以怎么算总分呢:规则一很好办,counter对应的哪一位数字次数>=3,就把该数字下标对应的分数加到sum里。规则二是难点也是代码的精髓,投5次骰子,3次以上计分,1或5不满3次按次数计分,满3次就减去3再计分。这种不满3取原值,满3减3再取值的行为和模3运算(即除3取余)是等价的(哪怕把规则扩展到更多次骰子,只要一次骰子只计分一次,这种模运算仍然可以起效)
    所以第二个表达式就很明显了,enumerate(counter)会为列表counter生成(index,counter)元组组成的可迭代对象,这样遍历出来就可以利用index来访问和counter对应的数字的point和extra的分数,(points[i] if count >= 3 else 0) 就是计算次数为3的数字的分数,extra[i] * (count % 3)就是计算剩余的1和5的分数

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 7月15日
  • 创建了问题 7月15日

悬赏问题

  • ¥500 求华为P30PRO手机硬盘数据恢复
  • ¥15 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题