首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >好的和邪恶的字符串

好的和邪恶的字符串
EN

Stack Overflow用户
提问于 2020-03-29 20:52:05
回答 2查看 188关注 0票数 0

描述

中土世界就要开战了。善良的力量与邪恶势力有许多斗争。当然会涉及不同的种族。每一种比赛都有一定的价值。从善的角度看,我们有以下种族,它们具有相关的价值:

  • 霍比特人:1
  • 男子:2
  • 精灵:3
  • 矮人:3
  • 老鹰:4
  • 巫师: 10

在邪恶的一边:

  • 兽人:1
  • 男子:2
  • 翘曲:2
  • 地精:2
  • 乌鲁克海:3
  • 巨魔:5
  • 巫师: 10

尽管天气、地理位置、补给和勇敢在任何战斗中都起着一定的作用,但如果你把善的价值相加起来,并将其与邪恶的价值进行比较,那么价值更大的一方就更有可能获胜。 因此,给定每一个种族在善一方的计数,然后是邪恶一方的每一个种族的计数,决定哪一方获胜。

输入

该函数将被赋予两个参数。每个参数都是由单个空格分隔的字符串。每一根线都会包含每一个种族的善恶两面的计数。 第一个参数将按以下顺序包含每场比赛的数量:

哈比人,男人,精灵,矮人,老鹰,巫师。

第二个参数将按以下顺序包含邪恶一方的每个种族的计数:

兽人,人,魔兽世界,妖精,乌鲁克海,巨魔,巫师。

所有的值都是非负整数.每个边的值之和将不超过32位整数的极限。

输出

返回“战斗结果:善良战胜邪恶”,“战斗结果:邪恶消灭一切善的痕迹”,如果邪恶获胜,或者“战斗结果:在这个战场上没有胜利者”,如果它以平局结束。

尝试

代码语言:javascript
复制
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"

};

测试结果

代码语言:javascript
复制
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' );

我所有的测试都失败了,我错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-29 21:08:56

关于测试失败的原因,您有两个问题:

1)您使用的是'',而不是' ',它基本上是在每个字符之后分割的。

代码语言:javascript
复制
'0 0 0 0 0 10'.split('')
// Result:
[
  '0', ' ', '0', ' ',
  '0', ' ', '0', ' ',
  '0', ' ', '1', '0'
]

相反,您希望将其拆分为单个空间,结果如下:

代码语言:javascript
复制
'0 0 0 0 0 10'.split(' ')
// Result:
[ '0', '0', '0', '0', '0', '10' ]

2)假设你修正了问题#1,它仍然会失败。这是因为拆分的结果将是字符串,添加带有+的字符串将它们连接起来。

将要发生的事情的例子:

代码语言:javascript
复制
'0 1 1 1 1 0 0'.split(' ').reduce((a, b) => a + b, 0)
'00111100'

相反,您希望首先将数组项映射到数字。您可以使用.map(x => Number(x))或方便地使用.map(Number)来完成此操作。

代码语言:javascript
复制
'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)!

然后,将它们相加在一起,就像预期的那样:

代码语言:javascript
复制
'0 1 1 1 1 0 0'.split(' ').map(Number).reduce((a, b) => a + b, 0)
// Result:
4

TL;DR

要修复代码,你必须替换这个..。

代码语言:javascript
复制
good = good.split('')
evil = evil.split('')

...with这个:

代码语言:javascript
复制
good = good.split(' ').map(Number)
evil = evil.split(' ').map(Number)

此外,我建议签出如何使用调试器。这将允许您逐行遍历代码并检查值,例如代码执行。这样就能更好地了解这个问题。

等等,还有更多!

这只是修正了你的测试。不过,我认为,与您描述代码应该做的事情相比,这里缺少了另一个步骤,那就是给您的输入赋予不同的“权重”。现在你只是在添加数字,但是描述中说你得到的是战士的数量,而不是他们的加权值,作为输入。因此,我假设您还必须添加一个权重列表并乘以:

代码语言:javascript
复制
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回调,因此我们可以使用它从权重数组中获得正确的权重。

票数 1
EN

Stack Overflow用户

发布于 2020-03-29 21:03:43

你现在的功能只是把参与者的数量相加,而不考虑他们的体重。正如问题所述,不同的参与者有不同的权重。您需要检查正在迭代的数字的索引,并将其与相应的乘子数组中的相应项相乘。

您还需要确保使用预期的确切字符串:

代码语言:javascript
复制
Battle Result: Evil eradicates all trace of Good // expected
Battle Result: Evil eradicates all traces of Good // your string
代码语言:javascript
复制
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";

代码语言:javascript
复制
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' );

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60920568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档