Как заставить элемент в Array изменить его место - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в JS. Я пытался понять Цезарь Шифр ​​ROT13, но это было слишком сложно для меня. Поэтому я попытался написать свой собственный код. Вот оно ниже:

function encrip() {
  var 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"];
  var str = "Ni Hao"; 
  var string = str.toUpperCase();
    for (var i = 0; i < string.length; i++) {
        for (var k = 0; k < alphabet.length; k++) {
            if(string.charAt(i) == alphabet[k]) {
         /* console.log(string.charAt(i) + ' ' + alphabet.indexOf(alphabet[k])); */
        }
        }
    }
}
encrip();

Но я застрял. Как сделать:

1. Получить значение из var str и затем получить доступ к алфавиту var, после изменения каждой буквы от значения var str на следующие 3 из алфавита (var str будет изменена текущая позиция каждого элемента) Например: Input: Ni Hao ==> output: QL KDR

2. Создайте универсальный код, я имею в виду, не только для изменения позиции на 3, но когда я даю значение '5', каждый элемент будет изменен на следующие 5 позиций из алфавита. Таким образом, выходной сигнал может быть изменен, когда я изменяю его значение

Надеюсь, я все объяснил ясно. Спасибо всем заранее за помощь !!

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018
  • Вам не нужно два цикла для этого. Выполните итерацию по вводу string и найдите индекс каждого символа в массиве alphabet, если он найден, добавьте к нему shift, чтобы получить зашифрованный символ.

  • Для обработки переполнения используйте оператор модуля для циклического перемещения по массиву. Также я предполагаю, что вы не собираетесь использовать какие-либо специальные символы для шифрования.

function encrip(string, shift) {
  var 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"];
  string = string.toUpperCase();
  let arr = [];
    for (var i = 0; i < string.length; i++) {
       let char = alphabet.indexOf(string[i]) !== -1 ? alphabet[(alphabet.indexOf(string[i]) %26) + shift] : " ";
       arr.push(char);
    }
  let encryp = arr.join("");
  console.log(encryp);
  return encryp;
}
encrip("Ni Hao", 3);
0 голосов
/ 02 сентября 2018

Прежде всего, вместо внутреннего цикла for, сканирующего весь массив alphabet, вы можете использовать встроенную функцию indexOf :

alphabet.indexOf('K') // returns 10

Во-вторых, вы захотите собрать зашифрованную строку в отдельной переменной. Для каждой буквы получите индекс этой буквы в алфавите, добавьте параметр смещения шифра к этому индексу и добавьте полученную букву из алфавита в новую строку. Важным шагом является то, что при добавлении в индекс буквы вы хотите убедиться, что результирующий индекс находится в пределах диапазона для массива alphabet. Вы можете сделать это, используя оператор % (по модулю), который перенесет высокие значения обратно в начало массива. В полном объеме:

function encipher(input, offset) {
    var 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"];
    var str = input.toUpperCase();
    var result = '';

    for (var i = 0; i < str.length; i++) {
        letterIndex = alphabet.indexOf(str.charAt(i));
        if (letterIndex === -1) {
            result += str[i]; // if the letter isn't found in the alphabet, add it to the result unchanged
            continue;
        }

        cipheredIndex = (letterIndex + offset) % alphabet.length; // wrap index to length of alphabet
        result += alphabet[cipheredIndex];
    }

    console.log(result);
}

encipher('Ni Hao', 5); // output: 'SN MFT'
0 голосов
/ 02 сентября 2018

вы можете использовать следующую функцию для шифрования английских слов, 1-й параметр - это строка для шифрования, а 2-й - для сдвига

function encryp(str,pos){
   var alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   var strUC=str.toUpperCase();
   var enc="";
    for(var i=0;i<strUC.length;i++){
    if(strUC.charAt(i)!=" "){
    enc+=alpha.charAt((alpha.indexOf(strUC.charAt(i))+pos)%26)
     }
  else{
   enc+=" "
     }
   // in your case pos=3
    }
    
    return enc;
    }
console.log(encryp("NiHao",3));
...