这是挑战:凯撒密码-字母移动了13位。因此,“ A”↔“ N”,“ Q”↔“ D”,依此类推。
将ROT13编码的字符串作为输入并返回解码的字符串的函数。所有字母均为大写。不要转换任何非字母字符(即空格,标点符号),但要继续传递它们。
*我得到正确的输出,但是目前,每个字母都是一个字符串。有没有一种方法可以将所有单个字母组合成一个句子*
function rot13(str) {
var original = str.split('')
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('')
let i = 0;
while(i<original.length){
let indexVal = alphabet.indexOf(original[i])
if(indexVal>= 13){
indexVal -=13
}else if(indexVal===-1){
indexVal = 33
}
else{
indexVal += 13
}
var final = alphabet[indexVal]
i++;
console.log(final)
}
}
rot13("SERR CVMMN");//should log FREE PIZZA
/*
currently logs:
F
R
E
E
undefined
P
I
Z
Z
A
undefined
*/
类似的事情可能起作用:
const testStr = 'SERR CVMMN',
rot13 = str => {
const alph = [...'abcdefghijklmnopqrstuvwxyz']
return [...str]
.map(char => {
switch(true){
case !/[a-z]/i.test(char) :
return char // non alphabetic character translates to itself
case char.toLowerCase() == char :
return alph[(alph.indexOf(char)+13)%26] // lower case character translates to character 13 positions ahead
default :
return alph[(alph.indexOf(char.toLowerCase())+13)%26].toUpperCase() //upper case handled in a similar way
}
})
.join('')
}
console.log(rot13(testStr))
想出来] >>
function rot13(str) {
var original = str.split('')
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('')
let i = 0;
let arr = "";
while(i<original.length){
let indexVal = alphabet.indexOf(original[i])
if(indexVal>= 13){
indexVal -=13
}else if(indexVal===-1){
indexVal = 33
}
else{
indexVal += 13
}
arr+=alphabet[indexVal];
arr = arr.replace(undefined, original[i])
i++;
}
return arr
}
rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.");