diff --git a/src/core/operations/VigenèreDecode.mjs b/src/core/operations/VigenèreDecode.mjs index 8abaeed8..ce2046a8 100644 --- a/src/core/operations/VigenèreDecode.mjs +++ b/src/core/operations/VigenèreDecode.mjs @@ -38,32 +38,29 @@ class VigenèreDecode extends Operation { * @returns {string} */ run(input, args) { - const alphabet = "abcdefghijklmnopqrstuvwxyz", + const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789", key = args[0].toLowerCase(); - let output = "", - fail = 0, - keyIndex, - msgIndex, - chr; + let output = ""; + let fail = 0; + let keyIndex,msgIndex,chr; if (!key) throw new OperationError("No key entered"); - if (!/^[a-zA-Z]+$/.test(key)) throw new OperationError("The key must consist only of letters"); + if (!/^[a-zA-Z0-9]+$/.test(key)) throw new OperationError("The key must consist only of letters and numbers"); for (let i = 0; i < input.length; i++) { - if (alphabet.indexOf(input[i]) >= 0) { + const currentChar = input[i]; + const lowerChar = currentChar.toLowerCase(); + //Implementing logic + if (alphabet.indexOf(lowerChar) >= 0) { chr = key[(i - fail) % key.length]; keyIndex = alphabet.indexOf(chr); - msgIndex = alphabet.indexOf(input[i]); - // Subtract indexes from each other, add 26 just in case the value is negative, - // modulo to remove if necessary - output += alphabet[(msgIndex - keyIndex + alphabet.length) % 26]; - } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { - chr = key[(i - fail) % key.length].toLowerCase(); - keyIndex = alphabet.indexOf(chr); - msgIndex = alphabet.indexOf(input[i].toLowerCase()); - output += alphabet[(msgIndex + alphabet.length - keyIndex) % 26].toUpperCase(); + msgIndex = alphabet.indexOf(lowerChar); + // Decode character using the Vigenère formula + const decodedChar = alphabet[(msgIndex - keyIndex + alphabet.length) % alphabet.length]; + // Preserve case for letters and add to output + output += currentChar === lowerChar ? decodedChar : decodedChar.toUpperCase(); } else { - output += input[i]; + output += currentChar; // Keep non-alphabetic characters as is fail++; } } diff --git a/src/core/operations/VigenèreEncode.mjs b/src/core/operations/VigenèreEncode.mjs index db212fe2..d1f275f8 100644 --- a/src/core/operations/VigenèreEncode.mjs +++ b/src/core/operations/VigenèreEncode.mjs @@ -8,7 +8,7 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; /** - * Vigenère Encode operation + * Vigenère Encode operation is done */ class VigenèreEncode extends Operation { @@ -39,36 +39,29 @@ class VigenèreEncode extends Operation { * @returns {string} */ run(input, args) { - const alphabet = "abcdefghijklmnopqrstuvwxyz", + const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789", key = args[0].toLowerCase(); - let output = "", - fail = 0, - keyIndex, - msgIndex, - chr; + let output = ""; + let fail = 0; + let keyIndex, msgIndex, chr; if (!key) throw new OperationError("No key entered"); - if (!/^[a-zA-Z]+$/.test(key)) throw new OperationError("The key must consist only of letters"); + if (!/^[a-zA-Z0-9]+$/.test(key)) throw new OperationError("The key must consist only of letters and numbers"); for (let i = 0; i < input.length; i++) { - if (alphabet.indexOf(input[i]) >= 0) { - // Get the corresponding character of key for the current letter, accounting - // for chars not in alphabet + const currentChar = input[i]; + const lowerChar = currentChar.toLowerCase(); + //Implementing logic + if (alphabet.indexOf(lowerChar) >= 0) { + // Get the corresponding character of key for the current letter chr = key[(i - fail) % key.length]; - // Get the location in the vigenere square of the key char keyIndex = alphabet.indexOf(chr); - // Get the location in the vigenere square of the message char - msgIndex = alphabet.indexOf(input[i]); - // Get the encoded letter by finding the sum of indexes modulo 26 and finding - // the letter corresponding to that - output += alphabet[(keyIndex + msgIndex) % 26]; - } else if (alphabet.indexOf(input[i].toLowerCase()) >= 0) { - chr = key[(i - fail) % key.length].toLowerCase(); - keyIndex = alphabet.indexOf(chr); - msgIndex = alphabet.indexOf(input[i].toLowerCase()); - output += alphabet[(keyIndex + msgIndex) % 26].toUpperCase(); + msgIndex = alphabet.indexOf(lowerChar); + const encodedChar = alphabet[(keyIndex + msgIndex) % alphabet.length]; + // Preserve case for letters + output += currentChar === lowerChar ? encodedChar : encodedChar.toUpperCase(); } else { - output += input[i]; + output += currentChar; // Keep non-alphabetic characters as is fail++; } }