当前位置: 首页 > 知识库问答 >
问题:

JavaScript-Caesar密码

孟思远
2023-03-14

它对正数有效,但对负数无效。(我还应该指出,我还没有想到如何处理空格,我只是想让它首先为单个单词工作,然后从那里开始,谢谢!)

任何正确方向的指针都将不胜感激。

Kata说明:

函数caesarCipher应该接受一个字符串和一个数字(n),并返回一个应用了凯撒密码的新字符串。凯撒密码将每个明文字母替换为不同的字母,在字母表的上下固定的位置。N表示应该应用的字母表上下移位的数目。它可能是消极的,也可能是积极的。

  E.g.
  caesarCipher('hello', 2)
    --> 'jgnnq'
  caesarCipher('hello world!', -3)
    --> 'ebiil tloia!'

我的测试:

const caesarCipher = require("../katas/caesar-cipher");
const { expect } = require("chai");

describe.only("caesarCipher", () => {
  it("returns an empty string when passed an empty string", () => {
    const alphabet = [
      "a",
      "b",
      "c",
      "d",
      "e",
      "f",
      "g",
      "h",
      "i",
      "j",
      "k",
      "l",
      "m",
      "n",
      "o",
      "p",
      "q",
      "r",
      "s",
      "t",
      "u",
      "v",
      "w",
      "x",
      "y",
      "z"
    ];
    const str = "";
    const num = 2;
    const actualResults = caesarCipher(alphabet, str, num);
    const expectedResults = "";
    expect(actualResults).to.equal(expectedResults);
  });
  it("returns a string with the letters replaced by the number of shifts up the alphabet", () => {
    const alphabet = [
      "a",
      "b",
      "c",
      "d",
      "e",
      "f",
      "g",
      "h",
      "i",
      "j",
      "k",
      "l",
      "m",
      "n",
      "o",
      "p",
      "q",
      "r",
      "s",
      "t",
      "u",
      "v",
      "w",
      "x",
      "y",
      "z"
    ];
    const str = "hi";
    const num = 2;
    const actualResults = caesarCipher(alphabet, str, num);
    const expectedResults = "jk";
    expect(actualResults).to.equal(expectedResults);
  });
  it("returns a string with the letters replaced by the number of shifts down the alphabet", () => {
    const alphabet = [
      "a",
      "b",
      "c",
      "d",
      "e",
      "f",
      "g",
      "h",
      "i",
      "j",
      "k",
      "l",
      "m",
      "n",
      "o",
      "p",
      "q",
      "r",
      "s",
      "t",
      "u",
      "v",
      "w",
      "x",
      "y",
      "z"
    ];
    const str = "dog";
    const num = -3;
    const actualResults = caesarCipher(alphabet, str, num);
    const expectedResults = "ald";
    expect(actualResults).to.equal(expectedResults);
  });
});
function caesarCipher(alphabet, str, num) {
  const strToArray = str.split("");
  console.log(strToArray);
  const cipheredStr = [];
  for (let i = 0; i < strToArray.length; i++) {
    for (let j = 0; j < alphabet.length; j++) {
      if (strToArray[i] === alphabet[j] && Math.sign(num) === 1) {
        console.log(Math.sign(num));
        cipheredStr.push(alphabet[(j += num)]);
      } else if (strToArray[i] === alphabet[j] && Math.sign(num) === -1) {
        console.log(Math.sign(num));
        console.log(alphabet[(j -= num)]);
        cipheredStr.push(alphabet[(j -= num)]);
      }
    }
  }
  console.log(cipheredStr.join(""));
  return cipheredStr.join("");
}

结果:

caesarCipher
[]

    ✓ returns an empty string when passed an empty string
[ 'h', 'i' ]
1
1
jk
    ✓ returns a string with the letters replaced by the number of shifts up the alphabet
[ 'd', 'o', 'g' ]
-1
g
-1
r
-1
j
jum
    1) returns a string with the letters replaced by the number of shifts down the alphabet


  2 passing (15ms)
  1 failing

  1) caesarCipher
       returns a string with the letters replaced by the number of shifts down the alphabet:

      AssertionError: expected 'jum' to equal 'ald'
      + expected - actual

      -jum
      +ald
      
      at Context.<anonymous> (spec/caesar-cipher.spec.js:108:30)
      at processImmediate (internal/timers.js:456:21)

共有1个答案

羿昊英
2023-03-14

问题是,当num为负值时,您正在进行映射:

cipheredStr.push(alphabet[(j -= num)]);

但是num为负数。当你减去一个负数时,你所做的就是把它的绝对值相加。

相反,您应该做:

cipheredStr.push(alphabet[j + num]);

我知道你的解决方案正在进行中。你必须考虑到:

  • 当您对j+num求和进行翻译时会发生什么,并且它超出了字母表的界限。如果num.
  • 为负值,也会发生同样的情况
  • 在问题的声明中,它声明caesarcipher应该只接受两个参数,但您将字母表作为第一个参数传递!

祝您的代码好运,并继续尝试:)

 类似资料:
  • 我正在经历cs50,我被困在pset2凯撒。我按照指示一步一步地进行,我已经通过了关于验证密钥的部分——确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x或。/caesar xyz),则打印出用法:/caesar密钥\n.但一旦我添加下一行提示用户输入明文,然后打印回密文,它似乎不会注册验证密钥的前几行。我知道哈佛大学的学术诚信政策,所以我更多地是在寻求这方面

  • CaesarJ 是一种新的基于 Java 的编程语言,可促进更好的模块化和可重用组件的开发。这些组件是类的协作,但是它们可以使横切特征或非功能性问题模块化。Caesar 语言功能有助于实现,抽象和集成此类组件。Caesar 可以与纯Java结合使用。工具支持以Eclipse插件的形式提供。

  • 在最后一章中,我们讨论了反向密码。 本章详细讨论了凯撒密码。 凯撒密码算法 凯撒密码算法具有以下特点 - Caesar Cipher技术是一种简单易用的加密技术。 它是简单类型的替换密码。 每个纯文本字母都被一个字母替换,该字母具有一些固定数量的位置和字母。 下图描绘了Caesar密码算法实现的工作原理 - Caesar密码算法的程序实现如下 - def encrypt(text,s): resu

  • 这是我的代码,用来简单地加密文本,但我的老师说,我必须编程一个文件处理。但我不知道如何对此编程,也不知道如何加密和解密导入的文件。请帮帮我!

  • 问题内容: 我正在使用JavaScript加密用户密码,如下所示: 它工作正常,但现在我正尝试在服务器端的PHP中像这样解密: 它根本不起作用,解密后的密码字符串看起来很奇怪: 有用的注释后,这是我的JavaScript代码的当前状态: 我正在将saltHex和CipherTextHex发送到PHP服务器,并且正在使用mcrypt_decrypt(),如下所示: 仍然无法使用此更新的代码。 有人可

  • null 解密(PHP) $IVSIZE=mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_CBC); $iv=mcrypt_create_iv($ivsize,MCRYPT_RAND); mcrypt_decrypt(MCRYPT_RIJNDAEL_256,'test',$encrypt,MCRYPT_MODE_CBC,$iv);