构建一个函数,该函数将加密的字符串作为参数。这是Cesar加密。如:加密字符+ 5(或任何数字)。
问题:加密的字符串包含非字母数字字符,例如“”或“!”。
我构建了一个非常详细的功能,下面附上该功能以供完成。 解决上述问题的主要部分是:
let z = /[^A-^Z]/g;
if (strIn.search(z) !== 0) {
let n = strIn.search(z);
wordArr.splice(n, 0, strIn[n]);
strIn
是输入字符串(加密的字符串)的大写版本
wordArr
是解密版本,没有非字母数字字符。
我试图这样循环:
for (var i = 0; i < strIn.length; i++) {
if (strIn.search(z) !== 0) {
let n = strIn.search(z);
wordArr.splice(n, 0, strIn[n]);
}
}
我也尝试了while循环。类似无成功。 我也尝试绘制地图。但是比控制台抛出:
strIn.map is not a function
任何人都可以解释这种现象,并给我一个提示,指出如何解决此问题。 1.)使用循环 2.)尽可能使用更好的东西
以下是我的详细代码供参考或其他内容:
function rot13(str) {
let upper = str.toUpperCase().split("");
let index = [];
let decode = [];
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (var i = 0; i < upper.length; i++) {
if (alpha.indexOf(upper[i]) === -1) {
index.push(upper[i]);
} else if (alpha.indexOf(upper[i]) !== -1) {
index.push(alpha.indexOf(upper[i]));
}
}
console.log("index: " + index);
let elem = index.map(function(a, b) {
if (a === 13) {
return a - 13;
} else if (a + 13 <= 26) {
return a + 13;
} else if (a + 13 > 26) {
return a - 13;
}
});
console.log("elem :" + elem);
for (var j = 0; j < elem.length; j++) {
decode.push(alpha[elem[j]]);
}
let word = decode.join("");
let strIn = upper.join("");
console.log("strIn: " + strIn);
let z = /[^A-^Z]/g;
// let z = /[\!]/g;
let wordArr = Array.from(word);
if (strIn.search(z) !== 0) {
let n = strIn.search(z);
wordArr.splice(n, 0, strIn[n]);
}
console.log("wordArr: " + wordArr);
console.log(wordArr.join(""));
console.log(strIn.search(z));
}
rot13("SERR CVMMN!");
答案 0 :(得分:1)
我解决了问题。有些。
当我将加密的消息传递到类似rot13("LBH QVQ VG!");
的函数中时,我得到了希望的结果“您做到了!”。非字母数字显示在正确的位置并且没有移动,字母数字正确移动。
我只是添加了“”,“!”和“?”,“。”给我的const alpha
。如果输入字符串的索引字符为“ >=26
”(字母结尾),则不允许该函数移动这些字符并将其保留在位置上。就是这部分
if (a >= 26) {
return a;
}
在我的“移位字符方法”中
let elem = index.map(function(a, b) {
if (a >= 26) {
return a;
} else if (a === 13) {
return a - 13;
} else if (a + 13 <= 26) {
return a + 13;
} else if (a + 13 > 26) {
return a - 13;
}
});
elem
应该获得与我的const alpha
相匹配的正确索引。
alpha:
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ !?.";
在const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
之前
使用for循环,使用elem
的索引,我从alpha
得到了正确的值(字符)……我将它们推入名为decode
的数组中。
for (var j = 0; j < elem.length; j++) {
decode.push(alpha[elem[j]]);
}
word
是注销的搜索词。
let word = decode.join("");
如果有人可以向我展示一种更优雅的方式来解决这一难题,我将不胜感激。
function rot13(str) {
let upper = str.toUpperCase().split("");
let index = [];
let decode = [];
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ !?.";
for (var i = 0; i < upper.length; i++) {
if (alpha.indexOf(upper[i]) !== -1) {
index.push(alpha.indexOf(upper[i]));
} else if (alpha.indexOf(upper[i]) > 26) {
index.push(alpha.indexOf(upper[i]));
}
}
let elem = index.map(function(a, b) {
if (a >= 26) {
return a;
} else if (a === 13) {
return a - 13;
} else if (a + 13 <= 26) {
return a + 13;
} else if (a + 13 > 26) {
return a - 13;
}
});
for (var j = 0; j < elem.length; j++) {
decode.push(alpha[elem[j]]);
}
let word = decode.join("");
console.log(word);
}
rot13("LBH QVQ VG!"); // You did it!