2011-04-16 50 views
1

我正在尝试在JavaScript中编写一个简单的解密函数,该函数需要输入字符串并通过ASCII字母表查找所有26个变体的代码。我知道如何进行正常的解密,但它只是迭代一次,只给出一个变体而不是全部。26.我该如何改变它?JavaScript解密函数

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); 
} 
+1

(1)澄清。你有一个凯撒编码的代码,你想要生成所有可能的输入产生的加密文本? (2)邮政编码。 – delnan 2011-04-16 19:21:57

+0

你是指所有的排列? – pimvdb 2011-04-16 19:35:29

+0

我编辑它来显示我的代码,是的,我会有一个凯撒编码的代码。 – 2011-04-16 19:38:30

回答

2

我会假设你只有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 

编辑:现在递归的要求:

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)和n在1,2,... 26范围内映射caesarShifyBy(text = text,N)的curried版本(但没有jquery的javascript并没有很好的基本功能)。

+0

这是一种不使用for循环的方法吗? – 2011-04-16 19:39:18

+0

你正在使用的功能已经在使用一个for循环,它内部(你只是没有看到它)。你也可以使用我称之为'map'的函数。但除此之外,没有办法做你想做的事。不要担心,只要你执行一次代码,你需要输入的全部内容就是allCaesarShifts('我的加密文本')。 – ninjagecko 2011-04-16 19:43:18

+0

哦,你也可以使用递归方法。但是,您需要执行以下三件事之一:循环,递归或映射。 – ninjagecko 2011-04-16 19:49:54

0

要转换所有的数值字符实体将字符串中的他们的个性等价物可以做到这一点:

str.replace(/ &#(\ d +)/克,函数(M,N){返回String .fromCharCode(n);})