Javascript 更改字母算法,在JSBIN中工作,但在Coderbyte中不工作,寻求澄清

Javascript 更改字母算法,在JSBIN中工作,但在Coderbyte中不工作,寻求澄清,javascript,regex,string-matching,jsbin,Javascript,Regex,String Matching,Jsbin,我正在进行CoderByte练习,遇到了以下问题: >使用JavaScript语言,让函数LetterChanges(str)获取要传递的str参数,并使用以下算法对其进行修改。用字母表中紧跟其后的字母替换字符串中的每个字母(即c变为d,z变为a)。然后将这个新字符串(a、e、i、o、u)中的每个元音大写,最后返回这个修改后的字符串 我在JSBin中写了出来,效果很好(即使是te,但在CoderByte中却不是。我想问社区我写的是正确的,这是CoderByte上的问题,还是我的代码错了,问题出在

我正在进行CoderByte练习,遇到了以下问题:

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

我在JSBin中写了出来,效果很好(即使是te,但在CoderByte中却不是。我想问社区我写的是正确的,这是CoderByte上的问题,还是我的代码错了,问题出在JSBin上

代码如下:

function LetterChanges(str) {
    var iLetters = str.split('');
    var newStr = [];

    for (var i = 0; i < str.length; i++) {
        if (/[a-y]/ig.test(iLetters[i])) {
            newStr[i] = String.fromCharCode(iLetters[i].charCodeAt(0) + 1);
            if (/[aeiou]/ig.test(newStr[i])) {
                newStr[i] = newStr[i].toUpperCase();
            }
        } else if (/[z]/ig.test(iLetters[i])) {
            newStr[i] = "A";
        } else if (/[^A-Z]/ig.test(iLetters[i])) {
            newStr[i] = iLetters[i];
        }
    }

    return newStr.join('');
}
功能字母更改(str){
变量iLetters=str.split(“”);
var newStr=[];
对于(变量i=0;i
看起来他们的后端JS运行程序确实存在缺陷。正如您所说,您的代码运行良好,应该被接受。值得向他们的支持人员报告

以下是
.replace()
的替代解决方案:


看起来他们的后端JS运行程序确实存在一个bug。正如您所说,您的代码运行良好,应该被接受。值得向他们的支持人员报告

以下是
.replace()
的替代解决方案:


与下面的备选方案相比,您的代码对我来说运行良好

在CoderByte上,您的代码失败,但以下代码仍有效。在他们的网站上似乎存在问题

function letterChanges(str) {
    var newString = "",
        code,
        length,
        index;

    for (index = 0, length = str.length; index < length; index += 1) {
        code = str.charCodeAt(index);
        switch (code) {
            case 90:
                code = 65;
                break;
            case 122:
                code = 97
                break;
            default:
                if ((code >= 65 && code < 90) || (code >= 97 && code < 122)) {
                    code += 1;
                }
        }

        newString += String.fromCharCode(code);
    }

    return newString.replace(/[aeiou]/g, function (character) {
        return character.toUpperCase();
    });
}

console.log(LetterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));
console.log(letterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));

与下面的备选方案相比,您的代码对我来说运行良好

在CoderByte上,您的代码失败,但以下代码仍有效。在他们的网站上似乎存在问题

function letterChanges(str) {
    var newString = "",
        code,
        length,
        index;

    for (index = 0, length = str.length; index < length; index += 1) {
        code = str.charCodeAt(index);
        switch (code) {
            case 90:
                code = 65;
                break;
            case 122:
                code = 97
                break;
            default:
                if ((code >= 65 && code < 90) || (code >= 97 && code < 122)) {
                    code += 1;
                }
        }

        newString += String.fromCharCode(code);
    }

    return newString.replace(/[aeiou]/g, function (character) {
        return character.toUpperCase();
    });
}

console.log(LetterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));
console.log(letterChanges("Then capitalize every vowel in this new string (a, e, i, o, u) and finally return this modified string."));

这是来自@Fabricio Matté答案的另一个解决方案 有一点解释是,使用正则表达式从a到z使用
/[a-z]/
获取第一个字母表,然后使用
string.fromCharCode(Estr.charCodeAt(0)+1)将它们替换为ASCII,剩下的就是找到元音再次使用正则表达式
[aeiou]
并返回其大写字符串

function LetterChanges(str) { 
    return str.replace(/[a-z]/ig, function(Estr) {
        return String.fromCharCode(Estr.charCodeAt(0)+1);
    }).replace(/[aeiou]/ig, function(readyStr) {
        return readyStr.toUpperCase();
    })   
}

这是来自@Fabricio Matté答案的另一个解决方案 有一点解释是,使用正则表达式从a到z使用
/[a-z]/
获取第一个字母表,然后使用
string.fromCharCode(Estr.charCodeAt(0)+1)将它们替换为ASCII,剩下的就是找到元音再次使用正则表达式
[aeiou]
并返回其大写字符串

function LetterChanges(str) { 
    return str.replace(/[a-z]/ig, function(Estr) {
        return String.fromCharCode(Estr.charCodeAt(0)+1);
    }).replace(/[aeiou]/ig, function(readyStr) {
        return readyStr.toUpperCase();
    })   
}

似乎他们的后端JS runner被窃听了,或者是控制台中的错误,尽管看起来不相关。谢谢你,我很感激。为了一次技术面试,我伸展了我的JS肌肉,这让我感到非常紧张。似乎他们的后端JS runner被窃听了,或者是控制台中的错误,尽管看起来不相关。谢谢,我很感激。为了一次技术面试,我伸展了我的JS肌肉,这给我带来了前所未有的压力。+1我喜欢你的答案,这是一个精彩的答案。我必须说,因为你的答案,我不得不放弃我的正则表达式技能(仍然需要学习更多)。但看看我的解决方案。没有得到这个c部分。toUpperCase()=='Z'?'A':@这是“Z变成”的一部分。
toUpperCase
以不区分大小写的方式应用于此(Z->A,Z->A)。A字符总是大写,因为算法在结尾将所有元音大写。谢谢你的回答。因为算法在结尾总是将元音大写,并且程序已经使用
字符串将单词替换为下一个单词。fromCharCode(c.charCodeAt(0)+1)
所以,我想知道我们真的需要“z变成”部分吗。Cheers@Danish这个问题中要求“z成为”部分。请注意,“z”的字符码是122,下一个字符码是123,对应于“{”字符。同样,“z”之后的下一个字符是“[(使用字符码+1逻辑)。这就是我显式编码“z成为”的原因“部分。@Fabricio Matté谢谢你的解释。现在一切都清楚了:)这就是为什么我为你做了+1!+1我喜欢你的答案这是一个精彩的答案。我必须说,因为你的答案,我不得不放弃我的正则表达式技能(仍然需要学习更多)。但是看看我的解决方案。没有得到这个c部分。toUpperCase()=='Z'?'A':@这是“Z变成”的一部分。
toUpperCase
以不区分大小写的方式应用于此(Z->A,Z->A)。A字符总是大写,因为算法在结尾将所有元音大写。谢谢你的回答。因为算法在结尾总是将元音大写,并且程序已经使用
字符串将单词替换为下一个单词。fromCharCode(c.charCodeAt(0)+1)
所以,我想知道我们真的需要“z变成”部分吗。Cheers@Danish这个问题中要求“z成为”部分。请注意,“z”的字符码是122,下一个字符码是123,对应于“{”字符。同样,“z”之后的下一个字符是“[(使用字符码+1逻辑)。这就是我显式编码“z成为”的原因“部分。@Fabricio Matté谢谢你的解释。现在一切都清楚了:)这就是我为你做+1的原因!