塞萨尔解密。如何处理非字母字符JS

时间:2019-03-01 17:10:37

标签: javascript regex for-loop encryption

构建一个函数,该函数将加密的字符串作为参数。这是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!");

1 个答案:

答案 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!