我正在解决Codewars的Highest Scoring Word挑战,其中指出了
给定一串单词(x),你需要找到最高得分 字。
一个单词的每个字母根据它在中的位置得分 字母。 a = 1,z = 26以及介于两者之间的一切。
您需要将得分最高的单词作为字符串返回。
如果两个单词得分相同,则返回最早出现的单词 原始字符串。
所有字母均为小写,所有输入均有效。
我对问题的处理方法如下 -
a - 1
,b - 2
等。步骤2中返回的数组将包含原始字符串中每个单词的分数。找到此数组中的最大值并获取它的位置,从该特定位置的原始字符串返回单词。
我的代码段(演示here) -
function high(x) {
let myObj = {};
for (let i = 1; i <= 26; i++) {
myObj[String.fromCharCode(i + 96)] = i;
}
// console.log(myObj);
let scores = x.split(' ').map(word => [...word].map(a => myObj[a]).reduce((a, b) => a + b, 0));
return x.split(' ')[scores.indexOf(Math.max(...scores))];
}
console.log(high('take me to semynak'))
&#13;
当我在代码大战中运行时,结果显示104次通过测试,1次失败,1次错误。唯一的信息。关于显示的失败/错误是 -
预期:&#39; bintang&#39;而是得到:undefined
由于未显示此测试用例的实际输入,因此该信息。本身并不是很有用。
我试着考虑一些边缘情况,比如两个具有相同分数的单词,但即便如此.indexOf()
也应返回前一个值的位置,如本例所示 -
let nums = [1, 2, 3, 3];
console.log(nums.indexOf(Math.max(...nums)));
&#13;
这是截图 -
答案 0 :(得分:2)
问题陈述说单词只包含小写字母,但并不保证输入字符串只包含单词和空格。
为了计算标点符号,数字和其他非单词,您需要将所有小写字母序列提取为单词(而不是仅在空格上分割输入字符串)。
function high(x) {
let words = x.split(/[^a-z]+/);
let scores = words.map(word => [...word].map(a => a.charCodeAt(0) - 96).reduce((a, b) => a + b, 0));
return words[scores.indexOf(Math.max(...scores))];
}
console.log(high('today is 24 august, 2017'));
&#13;