Coderbyte挑战4:信件变化 - 不会是大写

时间:2013-11-07 23:24:59

标签: javascript

我遇到了Coderbyte挑战的问题

使用JavaScript语言,使用函数LetterChanges(str)传递str参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串中的每个元音(a,e,i,o,u),最后返回这个修改后的字符串。

这是我的代码:

function LetterChanges(str) {
str = str.toLowerCase();
var al = "abcdefghijklmnopqrstuvwxyz";
var vo = "aeiou";
var newStr = "";
for (var i = 0;i < str.length;i++) {
    if (al.charAt(al.indexOf(str.charAt(i))) == "z") {
        newStr += "A";
    }
    else if (str.charAt(i) == " "){
        newStr += " ";
    }
    else {
        if (al.charAt(al.indexOf(str.charAt(i))+1) == vo.charAt(vo.indexOf(str.charAt(i)))) {
            newStr += vo.charAt(vo.indexOf(str.charAt(i))+1).toUpperCase();
        }
        else {
            newStr += al.charAt(al.indexOf(str.charAt(i))+1)
        }
    }
}
   console.log(newStr);
}
LetterChanges("Argument goes here")

这会将以下内容返回到控制台: bshvnfou hpft ifsf

但我需要返回的是: bshvnfOU hpft Ifsf

我无法弄清楚为什么.toUpperCase()无效。非常感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:1)

您的问题不是toUpperCase()不起作用,而是您的代码永远不会到达那一点。

你的

if (al.charAt(al.indexOf(str.charAt(i))+1) == vo.charAt(vo.indexOf(str.charAt(i))))

由于+1

永远不会过去。那里没有必要,如果你删除它,将出现大写元音。除此之外,你的代码还有其他问题,但我会让你解决它们作为挑战的一部分: - )

答案 1 :(得分:1)

哇,看着我一年前写的代码真是太疯狂了!回顾这个问题,这就是我提出的问题(免责声明:仍然对ES6感到满意):

function convertText (str) {
    const al = 'abcdefghijklmnopqrstuvwxyz';
    return str.toLowerCase().split('').map(letter => {
        if (letter.match(/\W/)) return letter;
        const index = al.indexOf(letter),
            newLetter = (al[index + 1] || al[0]);
        return newLetter.match(/[aeiou]/) ? newLetter.toUpperCase() : newLetter;
    }).join('');
}

使用字符代码:

function letterChanges (str) {
    const v = {d: 69, h: 73, n: 79, t: 85, z: 65};
    return str.toLowerCase().split('').map(l => 
        (l.match(/\W/) ? l : String.fromCharCode(v[l] || l.charCodeAt(0) + 1))
    ).join('');
}

可能有更好的方法,但仍然是一个有趣的问题!再次感谢您的帮助@MattDiamant

答案 2 :(得分:0)

这是我的解决方案。它确实满足 z成为 的要求,但是它通过了Coderbyte的测试,如下面的屏幕截图所示。

function LetterChanges(str) {
    return str
        .replace(/[a-z]/gi, c => String.fromCharCode(c.charCodeAt(0) + 1))
        .replace(/[aeiou]/gi, c => c.toUpperCase());
}

// keep this function call here
LetterChanges(readline());

Letter Changes Javascript Solution