JavaScript - Цезарь Шифр - PullRequest
       4

JavaScript - Цезарь Шифр

3 голосов
/ 16 февраля 2020

Я знаю, что в прошлом было несколько постов о Цезарь Шифрах, на которые я смотрел, но я не нашел ответа, который помог бы мне решить эту кату, отсюда и мой пост.

Язык JavaScript. Я написал 3 теста, 2 из которых уже пройдены, а третий - нет. Я попытался использовать вложенные значения от l oop до l oop по алфавиту и по строке и сравнить их, затем переместить индекс алфавита вверх / вниз в зависимости от того, какое число было, а затем pu sh этой буквы в новый массив и вернуть объединенный массив в конце.

Он работает для положительных чисел, но не для отрицательных. (Я должен также отметить, что я еще не подумал о том, как обрабатывать пробелы, я просто хотел, чтобы сначала он работал для отдельных слов, а затем взять его оттуда, спасибо!)

Любые указатели в правильное направление приветствуется.

Инструкции 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 Ответ

1 голос
/ 16 февраля 2020

Проблема в том, что когда num отрицательно, вы делаете отображение:

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

Но num отрицательно. Когда вы вычитаете отрицательное число, вы добавляете его абсолютное значение.

Вместо этого вы должны сделать:

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

Также обратите внимание, что для вычисления индекса в алфавите, который вы используете Не нужно помещать туда =.


Дополнительные примечания

Я понимаю, что ваше решение находится в стадии разработки. Вы должны принять во внимание:

  • Что происходит, когда вы переводите сумму j + num, и она выходит за пределы вашего алфавита. То же самое может произойти с отрицательным значением num.
  • В объявлении проблемы говорится, что caesarCipher должен принимать только два параметра, но вы передаете алфавит в качестве первого параметра!

Удачи с вашим кодом и продолжайте попытки:)

...