我会假设你只有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并没有很好的基本功能)。
(1)澄清。你有一个凯撒编码的代码,你想要生成所有可能的输入产生的加密文本? (2)邮政编码。 – delnan 2011-04-16 19:21:57
你是指所有的排列? – pimvdb 2011-04-16 19:35:29
我编辑它来显示我的代码,是的,我会有一个凯撒编码的代码。 – 2011-04-16 19:38:30