Функция расшифровки JavaScript - PullRequest
1 голос
/ 16 апреля 2011

Я пытаюсь написать простую функцию расшифровки в JavaScript, которая будет принимать входную строку символов и проходить алфавит в ASCII, чтобы найти все 26 вариантов кода. Я знаю, как сделать нормальное дешифрование, но оно повторяется только один раз и дает только один вариант, а не все 26. Как мне его изменить?

var count = 0;
function inputData(buttonPress)
{

var stringData = document.getElementById("stringData").value;
    var splitStr = stringData.toLowerCase();
    var sendStr = (splitStr).split("");
     shift= 26;
     decrypt(sendStr, shift);
    }
function decrypt(newStr, shift)
{
    if(count < newStr.length)
    { 
      var strAscii = newStr[count].charCodeAt(0);
      strAscii=parseInt(strAscii);
      var newStrAscii= ((strAscii -97 -shift) % 26) + 97;
      newStr[count] = String.fromCharCode(newStrAscii);
      count++;
      decrypt(newString,shift-1);
    }
     newStr= newStr.join("");
     alert(newStr);
}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2011

Я буду считать, что у вас есть только функция ROT13.Если бы это было просто +1 к смещению буквы, вы могли бы просто использовать цикл for, где каждый раз вы берете свой предыдущий вывод и пропускаете его снова и снова.

Вот самый короткий и самый элегантный способЯ мог бы придумать такой код:

var alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('')
function nextLetter(letter) {
    var index = alphabet.indexOf(letter)
    return alphabet[(index+1) % 26]
}

function caesarShiftBy1(text) {
    return text.split('').map(nextLetter).join('')
}

function allCaesarShifts(text) {
    var temp = text.toLowerCase();
    for (var i=0; i<26; i++) {
        console.log(temp);
        temp = caesarShiftBy1(temp);
    }
}

В результате:

allCaesarShifts('abcdefghijklmnopqrstuvwxyz')
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy

edit: теперь рекурсивно по запросу:

function allCaesarShifts(text) {
    var toReturn = [];
    function helper(text, offset) {
        toReturn +=[ caesarShift(text,offset) ];
        if (offset>0)
            helper(text, offset-1);
    }
    helper(text, 26);
    return toReturn;
}

Более элегантно было бысоздайте функцию shiftLetter (letter, offset = 1), caesarShiftBy (text, offset = 1), а затем отобразите каррированную версию caesarShifyBy (text = text, N) в диапазоне 1,2, ... 26 (но javascriptбез jquery пока нет хороших примитивов для этого материала).

0 голосов
/ 01 мая 2011

Чтобы преобразовать все числовые символьные объекты в строке в их символьные эквиваленты, вы можете сделать это:

str.replace (/ & # (\ d +); / g, function (m, n) {return)String.fromCharCode (n);})

...