我正在研究Codewars问题,并且能够解决大部分问题,但最后一部分除外。面临的挑战是“ rot13”
ROT13是一种简单的字母替换密码,它将字母替换为字母后的13个字母。 ROT13是凯撒密码的一个示例。创建一个接受字符串并返回用Rot13加密的字符串的函数。
function rot13(message){
message = message.split('');
let alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
let indexes = message.map(char => alphabet.indexOf(char));
let result = indexes.map(i => {
let val = i + 13;
let max = 26;
if (val > max) {
let temp = val - max;
val = temp;
}
return val;
});
//result = [6, 17, 5, 6];
//i want to use the elements in my result array, and
//grab the letters from my alphabet array whose indexes associate with those elements from my result array
}
rot13('test') // 'grfg'
这是我当前在此问题中的状态。我尝试检查结果数组中是否包含字母===中的元素的索引,如果是,将这些字符从我的字母数组推入一个空数组,但是我收到 -1
解决这个问题/改变我的思维过程的任何建议都会有所帮助。谢谢!
答案 0 :(得分:1)
要直接回答您的问题,只需添加:
return results.map(i => alphabet[i]).join('')
在函数末尾。
作为旁注,可以使用String.fromCharCode
函数来代替字母数组。它将数字转换为等效的ASCII字符(大写字母开头为65)。
function rot13(message){
message = message.split('');
let alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
let indexes = message.map(char => alphabet.indexOf(char));
let result = indexes.map(i => {
let val = i + 13;
let max = 26;
if (val > max) {
let temp = val - max;
val = temp;
}
return val;
});
return result.map(i => alphabet[i]).join('');
}
console.log(rot13('test')) // 'grfg'
答案 1 :(得分:1)
尝试一下
function rot13(message) {
message = message.split('');
let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
return message.map(char => {
let i = alphabet.indexOf(char);
i = (i + 13) % alphabet.length;
return alphabet[i];
}).join("");
}
console.log(rot13('test')); // 'grfg'
答案 2 :(得分:1)
使用另一个map()
通过索引result
将alphabet
转换回字符。然后使用join('')
使其成为字符串。然后将其返回给呼叫者。
您可以使用模数简化ROT13的计算。
function rot13(message) {
message = message.split('');
let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
let indexes = message.map(char => alphabet.indexOf(char));
let result = indexes.map(i => {
let val = (i + 13) % 26;
return val;
});
return result.map(i => alphabet[i]).join('');
}
console.log(rot13('test'));
请注意,只有当字符串仅包含小写字母时,此方法才能正常工作。其他任何事物都会从-1
返回indexOf
,您需要检查一下。
答案 3 :(得分:0)
尝试一下:
function rot13(message){
message = message.split('');
let finalResult = "";
const alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
message.forEach(item => {
const index = alphabet.indexOf(item);
let cipherIndex = index + 13;
if(cipherIndex > 25)
cipherIndex = index - 13
finalResult = finalResult + alphabet[cipherIndex]
})
return finalResult;
}