JS: ¿cómo cambiar cada letra en la cadena dada N lugares abajo en el alfabeto?

¿Cómo cambiar cada letra en la cadena dada N lugares abajo en el alfabeto? La puntuación, los espacios y las mayúsculas deben permanecer intactos. Por ejemplo, si la cadena es “ac” y num es 2, la salida debería ser “ce”. ¿Qué pasa con mi código? Convierte la letra a ASCII y agrega el número dado, luego se convierte de ASCII a carta devuelta. La última línea reemplaza el espacio.

function CaesarCipher(str, num) { str = str.toLowerCase(); var result = ''; var charcode = 0; for (i = 0; i < str.length; i++) { charcode = (str[i].charCodeAt()) + num; result += (charcode).fromCharCode(); } return result.replace(charcode.fromCharCode(), ' '); } 

Me estoy poniendo

 TypeError: charcode.fromCharCode is not a function 

Debe pasar un argumento al método fromCharCode usando el objeto String. Tratar:

 function CaesarCipher(str, num) { // you can comment this line str = str.toLowerCase(); var result = ''; var charcode = 0; for (var i = 0; i < str.length; i++) { charcode = (str[i].charCodeAt()) + num; result += String.fromCharCode(charcode); } return result; } console.log(CaesarCipher('test', 2)); 

Hay que tener en cuenta el hecho de cambiar las últimas letras del alfabeto al principio. Aquí está mi opinión sobre eso:

 var input = "Caesar Cipher"; function CaesarCipher(str, num) { var alphabet = "abcdefghijklmnopqrstuvwxyz"; var newStr = ""; for (var i = 0; i < str.length; i++) { var char = str[i], isUpper = char === char.toUpperCase() ? true : false; char = char.toLowerCase(); if (alphabet.indexOf(char) > -1) { var newIndex = alphabet.indexOf(char) + num; if(newIndex < alphabet.length) { isUpper ? newStr += alphabet[newIndex].toUpperCase() : newStr += alphabet[newIndex]; } else { var shiftedIndex = -(alphabet.length - newIndex); isUpper ? newStr += alphabet[shiftedIndex].toUpperCase() : newStr += alphabet[shiftedIndex]; } } else { newStr += char; } } return newStr; } console.log(CaesarCipher(input, 20)); 
 function caesarCipher(s, k) { var n = 26; // alphabet letters amount if (k < 0) { return caesarCipher(s, k + n); } return s.split('') .map(function (c) { if (c.match(/[az]/i)) { var code = c.charCodeAt(); var shift = code >= 65 && code <= 90 ? 65 : code >= 97 && code <= 122 ? 97 : 0; return String.fromCharCode(((code - shift + k) % n) + shift); } return c; }).join(''); } 

Use String.charCodeAt () para convertir el carácter inglés a ASCII.

Use String.fromCharCode () para convertir ASCII a caracteres en inglés.

Prueba con caesarCipher("always-look-on-the-bright-side-of-life", 10) => "kvgkic-vyyu-yx-dro-lbsqrd-csno-yp-vspo"

caesarCipher("kvgkic-vyyu-yx-dro-lbsqrd-csno-yp-vspo", -10) => "siempre-mirar-en-el-lado-shiny de la vida"

La función fromCharCode no opera en cadenas, opera en el objeto String global como String.fromCharCode(65, 66, 67); // "ABC" String.fromCharCode(65, 66, 67); // "ABC" arrancó directamente de los documentos.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode

Esa es mi solucion

 function rot13(str) { var result = str.split("") .map(function(val) { var letterKey = val.charCodeAt() - 13; if(letterKey < 65){ letterKey = 90 - (65 - letterKey - 1); } console.log(letterKey); return String.fromCharCode(letterKey); }) .join(""); return result; } 

Tratar:

 result += String.fromCharCode(charcode) 

Tomado de: http://www.w3schools.com/jsref/jsref_fromCharCode.asp

Sé que esto es un poco viejo, pero pensé que lo intentaría. Aquí está mi opinión sobre ello.

Cuenta con mayúsculas y minúsculas. ¡También puede desplazar hacia adelante o hacia atrás cualquier cantidad!

 function shift(str, n) { var shifted = ''; n = n%26; for (var i = 0; i < str.length; i++) { let code = str[i].charCodeAt(); let capital = (code > 64 && code < 91) ? true : false; if (code < (capital?65:97) || code > (capital?90:122) || n == 0) { shifted += str[i]; continue; } if (n > 0) { if (code > (capital?90:122)-n) { code = n + code - 26; } else { code += n; } } else { if (code < (capital?65:97)-n) { code = code + n + 26; } else { code += n; } } shifted += String.fromCharCode(code); } return shifted; } console.log(shift('Ebiil, Tloia!', 3)); 

Poner mi sombrero en la refriega aquí, ya que acabo de completar este mismo desafío en HackerRank.

Mi solución es similar a la propuesta por @ Alexa-905.

Objetivos:

  • Gire el alfabeto k , por ejemplo, k = 3 , a convierte en d , z convierte en c
  • Las letras mayúsculas permanecen en mayúsculas, igual que en minúsculas
  • Todos los demás caracteres no [a-zA-Z] permanecen iguales

Números mágicos explicados:

  • 65-90 son los rangos de AZ (letras mayúsculas)
  • 97-122 son los rangos para az (letras minúsculas)
  • 26 es el número de letras en el alfabeto

Solución:

 function caesarCipher(s, k) { let result = ''; for (let i = 0; i < s.length; i++) { const charCode = s.charCodeAt(i); if ( (charCode < 65 || charCode > 122) || (charCode > 90 && charCode < 97) ) { result += s[i]; } else { let newCharCode = charCode + Math.ceil(k % 26); if (charCode >= 97 && newCharCode > 122) { newCharCode = newCharCode - 122 + 96; } if (charCode <= 90 && newCharCode > 90) { newCharCode = newCharCode - 90 + 64; } result += String.fromCharCode(newCharCode); } } console.log(result); return result } caesarCipher('F rpb Jxqe.zbfi(h%26) ql zrq altk lk olqxqflkp', 3); caesarCipher('26 rb cqn wdvkna xo unccnab rw cqn juyqjknc', 17) caesarCipher('65-90 mdq ftq dmzsqe rad ML (gbbqdomeq xqffqde)', 534); caesarCipher('97-122 kbo dro bkxqoc pyb kj (vygobmkco voddobc)', 425974); caesarCipher('Aopz jvkl ybuz ha 454,064 vwlyhapvuz wly zljvuk!', 19); caesarCipher('myyux://oxujwk.htr/hfjxfw-nk-ax-wjljc/1', 141235435141);