text: /**
   * Check if the Character is letter or not
   * @param {String} str - character to check
   * @return {object} An array with the character or null if isn't a letter
   */
  function isLetter(str) {
    return str.length === 1 && str.match(/[a-zA-Z]/i);
  }
  
  /**
   * Check if is Uppercase or Lowercase
   * @param {String} character - character to check
   * @return {Boolean} result of the checking
   */
  function isUpperCase(character) {
    if (character === character.toUpperCase()) {
      return true;
    }
    if (character === character.toLowerCase()) {
      return false;
    }
  }
  
  /**
   * Encrypt a Vigenere cipher
   * @param {String} message - string to be encrypted
   * @param {String} key - key for encrypt
   * @return {String} result - encrypted string
   */
  function encrypt(message, key) {
    let result = "";
  
    for (let i = 0, j = 0; i < message.length; i++) {
      const c = message.charAt(i);
      if (isLetter(c)) {
        if (isUpperCase(c)) {
          result += String.fromCharCode(
            ((c.charCodeAt(0) + key.toUpperCase().charCodeAt(j) - 2 * 65) % 26) +
              65
          ); // A: 65
        } else {
          result += String.fromCharCode(
            ((c.charCodeAt(0) + key.toLowerCase().charCodeAt(j) - 2 * 97) % 26) +
              97
          ); // a: 97
        }
      } else {
        result += c;
      }
      j = ++j % key.length;
    }
    return result;
  }
  
  /**
   * Decrypt a Vigenere cipher
   * @param {String} message - string to be decrypted
   * @param {String} key - key for decrypt
   * @return {String} result - decrypted string
   */
  function decrypt(message, key) {
    let result = "";
  
    for (let i = 0, j = 0; i < message.length; i++) {
      const c = message.charAt(i);
      if (isLetter(c)) {
        if (isUpperCase(c)) {
          result += String.fromCharCode(
            90 - ((25 - (c.charCodeAt(0) - key.toUpperCase().charCodeAt(j))) % 26)
          );
        } else {
          result += String.fromCharCode(
            122 -
              ((25 - (c.charCodeAt(0) - key.toLowerCase().charCodeAt(j))) % 26)
          );
        }
      } else {
        result += c;
      }
      j = ++j % key.length;
    }
    return result;
  }
  
  const messageEncrypt = encrypt("Hello World!", "code");
  console.log(messageEncrypt); // "Jhpnr Yrvng!"
  
  const messageDecrypt = decrypt("Jsopq Zstzg!", "code");
  console.log(messageDecrypt); // "Hello World!"
  