Я буду считать, что у вас есть только функция 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 пока нет хороших примитивов для этого материала).