Codewars第八天--Good vs Evil

本文介绍了一个Codewars挑战题目的解决方案,该题目要求计算两支军队的战斗力并判断胜负。文章首先给出了一个初始但有缺陷的实现,并分析了其问题所在。随后,提出了使用Python的zip函数进行优化的方法,提高了代码效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codewars第八天–Good vs Evil

题目描述:

霍比特人:1
男子:2
精灵:3
矮人:3
老鹰队:4
巫师:10
在邪恶的一面,我们有:

兽人:1
男子:2
Wargs:2
哥布林:2
Uruk Hai:3
巨魔:5
巫师:10

输入:
该函数将给出两个参数。每个参数都是由单个空格分隔的字符串。每个字符串将包含善恶方面的每个种族的数量。

第一个参数将按以下顺序包含good的一侧的每个种族的计数:

霍比特人,男人,精灵,矮人,老鹰,巫师。
第二个参数将按以下顺序包含邪恶方面的每个种族的计数:

兽人,男人,Wargs,哥布林,乌鲁克海,巨魔,巫师。
所有值都是非负整数。由此产生的每一方的总和不会超过32位整数的限制。
输出:
通过他们的总的战斗力来判断哪一个势力将会在战斗中获胜.

开始时,所写的代码如下,通过记录输入的种族人数的索引去对应value 中的值,然后将他们相乘求和。
但是最后的结果永远会有6个test 通不过。例如:{1 0 0 0 1 0},{0 0 0 0 0 1 0} 。他们得到的正确结果应当是平手都为5,但是代码给的结果是evil 获胜了。通过输出他们具体的值发现,代码得出的结果是good 为2,evil 为5。
仔细查看代码发现,因为在这里我用的是索引去查找对应worth 中的值。而这个test 中不同位置上有着两个相同的值,使用index() 去找索引,他永远都只会返回索引0的值,找不到正确的位置,因此这样做事行不通的。

def goodVsEvil(good, evil):
    good_worth = [1, 2, 3, 3, 4, 10]
    evil_worth = [1, 2, 2, 2, 3, 5, 10]
    good = good.split()
    evil = evil.split()
    good_value = 0
    evil_value =0
    for i in good:
            index_g = int(good.index(i))
            good_value += int(i) * good_worth[index_g]
    for j in evil:
            index_e = int(evil.index(j))
            evil_value += int(j) * evil_worth[index_e]
    if good_value > evil_value:
        return 'Battle Result: Good triumphs over Evil'
    elif good_value < evil_value:
        return 'Battle Result: Evil eradicates all trace of Good'
    else:
        return 'Battle Result: No victor on this battle field'

改进的代码如下,这里使用了Python3zip 函数,这个函数可以将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。 他可以将这里的两个goodgood_worth 打包成一个元组,每个位置的值直接对应起来,不需要手动去查找index

def goodVsEvil(good, evil):
    good_worth = [1, 2, 3, 3, 4, 10]
    evil_worth = [1, 2, 2, 2, 3, 5, 10]
    good = good.split()
    evil = evil.split()
    good_value = 0
    evil_value =0
    for i,j in zip(good, good_worth):
            good_value += int(i) * j
    for i,j in zip(evil, evil_worth):
            evil_value += int(i) * j
    if good_value > evil_value:
        return 'Battle Result: Good triumphs over Evil'
    elif good_value < evil_value:
        return 'Battle Result: Evil eradicates all trace of Good'
    else:
        return 'Battle Result: No victor on this battle field'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值