描述
中土世界就要开战了。善良的力量与邪恶势力有许多斗争。当然会涉及不同的种族。每一种比赛都有一定的价值。从善的角度看,我们有以下种族,它们具有相关的价值:
在邪恶的一边:
尽管天气、地理位置、补给和勇敢在任何战斗中都起着一定的作用,但如果你把善的价值相加起来,并将其与邪恶的价值进行比较,那么价值更大的一方就更有可能获胜。 因此,给定每一个种族在善一方的计数,然后是邪恶一方的每一个种族的计数,决定哪一方获胜。
输入
该函数将被赋予两个参数。每个参数都是由单个空格分隔的字符串。每一根线都会包含每一个种族的善恶两面的计数。 第一个参数将按以下顺序包含每场比赛的数量:
哈比人,男人,精灵,矮人,老鹰,巫师。
第二个参数将按以下顺序包含邪恶一方的每个种族的计数:
兽人,人,魔兽世界,妖精,乌鲁克海,巨魔,巫师。
所有的值都是非负整数.每个边的值之和将不超过32位整数的极限。
输出
返回“战斗结果:善良战胜邪恶”,“战斗结果:邪恶消灭一切善的痕迹”,如果邪恶获胜,或者“战斗结果:在这个战场上没有胜利者”,如果它以平局结束。
尝试
function goodVsEvil(good, evil){
good = good.split('')
evil = evil.split('')
let light = good.reduce((a, b) => a + b, 0);
let dark = evil.reduce((a, b) => a + b, 0);
if(light > dark){
return "Battle Result: Good triumphs over Evil"
} else if (light < dark){
return "Battle Result: Evil eradicates all traces of Good"
}
return "Battle result: No victor on this battle field"
};测试结果
Test.expect( goodVsEvil('1 1 1 1 1 1', '1 1 1 1 1 1 1') === 'Battle Result: Evil eradicates all trace of Good', 'Evil should win' );
Test.expect( goodVsEvil('0 0 0 0 0 10', '0 1 1 1 1 0 0') === 'Battle Result: Good triumphs over Evil', 'Good should win' );
Test.expect( goodVsEvil('1 0 0 0 0 0', '1 0 0 0 0 0 0') === 'Battle Result: No victor on this battle field', 'Should be a tie' );我所有的测试都失败了,我错过了什么?
发布于 2020-03-29 21:08:56
关于测试失败的原因,您有两个问题:
1)您使用的是'',而不是' ',它基本上是在每个字符之后分割的。
'0 0 0 0 0 10'.split('')
// Result:
[
'0', ' ', '0', ' ',
'0', ' ', '0', ' ',
'0', ' ', '1', '0'
]相反,您希望将其拆分为单个空间,结果如下:
'0 0 0 0 0 10'.split(' ')
// Result:
[ '0', '0', '0', '0', '0', '10' ]2)假设你修正了问题#1,它仍然会失败。这是因为拆分的结果将是字符串,添加带有+的字符串将它们连接起来。
将要发生的事情的例子:
'0 1 1 1 1 0 0'.split(' ').reduce((a, b) => a + b, 0)
'00111100'相反,您希望首先将数组项映射到数字。您可以使用.map(x => Number(x))或方便地使用.map(Number)来完成此操作。
'0 1 1 1 1 0 0'.split(' ').map(Number)
// Result:
[
0, 1, 1, 1,
1, 0, 0
]
// Note how the array items are now numbers and not strings (no quotes in the output)!然后,将它们相加在一起,就像预期的那样:
'0 1 1 1 1 0 0'.split(' ').map(Number).reduce((a, b) => a + b, 0)
// Result:
4TL;DR
要修复代码,你必须替换这个..。
good = good.split('')
evil = evil.split('')...with这个:
good = good.split(' ').map(Number)
evil = evil.split(' ').map(Number)此外,我建议签出如何使用调试器。这将允许您逐行遍历代码并检查值,例如代码执行。这样就能更好地了解这个问题。
等等,还有更多!
这只是修正了你的测试。不过,我认为,与您描述代码应该做的事情相比,这里缺少了另一个步骤,那就是给您的输入赋予不同的“权重”。现在你只是在添加数字,但是描述中说你得到的是战士的数量,而不是他们的加权值,作为输入。因此,我假设您还必须添加一个权重列表并乘以:
const weights = {
good: [1, 2, 3, 3, 4, 10],
evil: [1, 2, 2, 2, 3, 5, 10]
}
// ...later on:
good = good.split(' ').map((val, index) => val * weights.good[index])
evil = evil.split(' ').map((val, index) => val * weights.evil[index])
// Note I don't use `Number` anymore because the multiplication (unlike the
// addition!) implicitly converts to a number.这段代码的工作方式是在数组中指定一个权重列表(实际上是两个,一个是好的,一个是邪恶的),然后将数字映射到它们的值乘以相应的权重。第二个参数作为数组索引传递给map回调,因此我们可以使用它从权重数组中获得正确的权重。
发布于 2020-03-29 21:03:43
你现在的功能只是把参与者的数量相加,而不考虑他们的体重。正如问题所述,不同的参与者有不同的权重。您需要检查正在迭代的数字的索引,并将其与相应的乘子数组中的相应项相乘。
您还需要确保使用预期的确切字符串:
Battle Result: Evil eradicates all trace of Good // expected
Battle Result: Evil eradicates all traces of Good // your stringconst goodValues = [1, 2, 3, 3, 4, 10];
const evilValues = [1, 2, 2, 2, 3, 5, 10];
const getValues = (str, values) => str.split(' ').reduce(
(a, count, i) => a + count * values[i],
0
);
const netValues = getValues(good, goodValues) - getValues(evil, evilValues);
if (netValues > 0) return "Battle Result: Good triumphs over Evil"
else if (netValues === 0) return "Battle Result: No victor on this battle field"
else return "Battle Result: Evil eradicates all trace of Good";
const goodVsEvil = (good, evil) => {
const goodValues = [1, 2, 3, 3, 4, 10];
const evilValues = [1, 2, 2, 2, 3, 5, 10];
const getValues = (str, values) => str.split(' ').reduce(
(a, count, i) => a + count * values[i],
0
);
const netValues = getValues(good, goodValues) - getValues(evil, evilValues);
if (netValues > 0) return "Battle Result: Good triumphs over Evil"
else if (netValues === 0) return "Battle Result: No victor on this battle field"
else return "Battle Result: Evil eradicates all trace of Good";
}
const Test = {
expect: console.log
};
Test.expect( goodVsEvil('1 1 1 1 1 1', '1 1 1 1 1 1 1') === 'Battle Result: Evil eradicates all trace of Good', 'Evil should win' );
Test.expect( goodVsEvil('0 0 0 0 0 10', '0 1 1 1 1 0 0') === 'Battle Result: Good triumphs over Evil', 'Good should win' );
Test.expect( goodVsEvil('1 0 0 0 0 0', '1 0 0 0 0 0 0') === 'Battle Result: No victor on this battle field', 'Should be a tie' );
https://stackoverflow.com/questions/60920568
复制相似问题