首页 > 解决方案 > JS ROT 13 部分工作,但不是全部工作

问题描述

我不知道我在这个函数中的错误在哪里。它适用于某些字符串,但不适用于所有字符串。你能不能给我一些建议。我想接受一个字符串,该函数应该返回一个字符串 + 字母表中的 13 个字符。如果有数字或特殊字符,请按原样打印所以它适用,rot13("aaaabbbb55")但不适用于rot13("father4") 感谢您的帮助!

function rot13(message) {
  var ceasar = message.toLowerCase().split("");
  var alpha = "abcdefghijklmnopqrstuvwxyz".split("");
  for (i = 0; i < ceasar.length; i++) {
    var letter = ""
    if (ceasar[i].match(/[a-z]/gi)) {
      letter = alpha.indexOf(ceasar[i])
      ceasar[i] = alpha[letter + 13]
    } else {
      continue
    };
  }
  return ceasar.join("")
}

标签: javascriptfunction

解决方案


正如Barmar 所说

更改letter + 13(letter + 13) % alpha.length使其环绕。

基本上,该行的问题ceasar[i] = alpha[letter + 13]在于,当一个字母在字母表的中间点之后时,letter + 13将导致索引超出范围。例如,字母tinfather对应于索引 19(从 0 开始的索引)。19 + 13 = 32,不对应alpha.

使用模块运算符(letter + 13) % alpha.length将“换行” 32 回到 6,这将是字母g


推荐阅读