javascript - 塞萨尔解密。如何处理非字母数字字符 | JS

标签 javascript regex for-loop encryption

构建一个以加密字符串作为参数的函数。这是凯撒加密。例如:加密字符 + 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/

相关文章:

javascript - 无法通过 jQuery 选择添加的 tr

javascript - 为什么这个 jQuery 验证工作错误?

regex - Python re.match 不匹配以 ".number"结尾的字符串

具有固定导航栏偏移量的 Javascript 平滑滚动

javascript - 如何在这段代码中添加JS使其自动滑动?

Java Bubblesort 仅交换第一个数组项

c++ - 这种优化技术的名称是什么?

c++ - 在 'break' 中使用 'for-loop' 对性能的影响

regex - 双字节数字到单字节数字的有效替换

java - 引用正则表达式中以前匹配的组