Rotate 13 Algorithm

JavaScript
function rot13(str) {
  
  // 1- Convert every character to the number portion (charCode) of the that character's HTML entity ---  
  //helpful map of HTML entities: https://unicode-table.com/en/
  //create an array containing all characters
  var indivChars = str.split("");
  //create an array of only every character that is not a capital letter
  var nonLetterRE = /[^A-Z]/g;
  var nonLetters = str.match(nonLetterRE);
  //create an empty array that will contain all the numerical values for the characters
  var numEntityArr = [];
  //cycle through array containing all characters & convert the capital letters to their character code
  //if a character does not belong to A-Z, assign it a value of 0
  for (let i = 0; i < indivChars.length; i++) {
    var numberEntity = indivChars[i].charCodeAt(0);
    if (numberEntity >= 65 && numberEntity <= 90) {
      numEntityArr.push(numberEntity);
    } else {
      numEntityArr.push(0);
    }
  }

  // 2 - shift each character code 13 positions numerically ---
  var shiftedArray = [];
  var counter = 0;
  for (let i = 0; i < numEntityArr.length; i++) {
    //if the character code represents a letter within A-M, add 13 to the character code
    if (numEntityArr[i] >= 65 && numEntityArr[i] <= 77) {
      numEntityArr[i] = numEntityArr[i] + 13;
      //push this new number into an array, along with prefix and suffix that make the character code an HTML entity
      shiftedArray.push("&#" + numEntityArr[i] + ";");
      //if the character code represents a letter within N-Z, subtract 13 from the character code
    } else if (numEntityArr[i] >= 78 && numEntityArr[i] <= 90) {
      numEntityArr[i] = numEntityArr[i] - 13;
      shiftedArray.push("&#" + numEntityArr[i] + ";");
      //if the character code is not A-Z or 0, simply add prefix and suffix to make it an HTML entity & push it into the array
    } else if (numEntityArr[i] !== 0) {
      shiftedArray.push("&#" + numEntityArr[i] + ";");
      //if the character code is 0, replace it with the corresponding index of the nonLetter array created above 
    } else if (numEntityArr[i] === 0) {
      shiftedArray.push(nonLetters[counter]);
      counter += 1;
    }
  }

  // 3 - return correct letters ---
  //join in a string the html entities and non A-Z characters pushed into shiftedArray
  var entityString = shiftedArray.join("");
  //convert the HTML entities into characters, while passing all other non-entity characters through
  //credit: http://stackoverflow.com/questions/7394748/whats-the-right-way-to-decode-a-string-that-has-special-html-entities-in-it
  function decodeHTML(html) {
    var txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
  }
  var decodedHTML = decodeHTML(entityString);
  return decodedHTML;
}

Leave a Reply

Your email address will not be published. Required fields are marked *