构建一个以加密字符串作为参数的函数。这是凯撒加密。例如:加密字符 + 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!");
最佳答案
我解决了这个问题。有些。
当我将加密消息传递到像 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
匹配的正确索引。
阿尔法:
const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ !?.";
之前是const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
使用来自 elem
的索引,由于 for 循环,我从 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!
关于javascript - 塞萨尔解密。如何处理非字母数字字符 | JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949337/