From 297fdb763d2ef8c50474bf450fac4daa31f8588c Mon Sep 17 00:00:00 2001 From: IcarusTheFly Date: Wed, 4 Oct 2023 01:01:44 +1100 Subject: [PATCH 1/2] Add Baconian Cipher --- Ciphers/BaconianCipher.js | 101 ++++++++++++++++++++++++++++ Ciphers/test/BaconianCipher.test.js | 17 +++++ 2 files changed, 118 insertions(+) create mode 100644 Ciphers/BaconianCipher.js create mode 100644 Ciphers/test/BaconianCipher.test.js diff --git a/Ciphers/BaconianCipher.js b/Ciphers/BaconianCipher.js new file mode 100644 index 0000000000..b4cde5e045 --- /dev/null +++ b/Ciphers/BaconianCipher.js @@ -0,0 +1,101 @@ +/** + * In cryptography, Bacon's cipher or the Baconian cipher is a method of steganographic message encoding devised by Francis Bacon in 1605. + * See [wiki](https://en.wikipedia.org/wiki/Bacon%27s_cipher) + */ + +const baconianAlphabet = { + A: 'AAAAA', + B: 'AAAAB', + C: 'AAABA', + D: 'AAABB', + E: 'AABAA', + F: 'AABAB', + G: 'AABBA', + H: 'AABBB', + I: 'ABAAA', + J: 'ABAAB', + K: 'ABABA', + L: 'ABABB', + M: 'ABBAA', + N: 'ABBAB', + O: 'ABBBA', + P: 'ABBBB', + Q: 'BAAAA', + R: 'BAAAB', + S: 'BAABA', + T: 'BAABB', + U: 'BABAA', + V: 'BABAB', + W: 'BABBA', + X: 'BABBB', + Y: 'BBAAA', + Z: 'BBAAB', + ' ': ' ' +} + +/** + * @function baconianEncode + * @description - Encodes a message using baconian cipher + * @param {string} message - Message to encode + * @return {string} A string with the encoded message + */ +const baconianEncode = (message) => { + if (typeof message !== 'string') { + throw new TypeError('The message must be a string') + } + + message = message.toUpperCase() + + let result = '' + + message.split('').forEach((char) => { + result += baconianAlphabet[char] + }) + + return result +} + +/** + * @function baconianDecode + * @description - Decoded a message encoded using baconian cipher + * @param {string} message - Message to decode + * @return {string} A string with the decoded message + */ +const baconianDecode = (message) => { + if (typeof message !== 'string') { + throw new TypeError('The encoded message must be a string') + } + + if (!/^[AB ]+$/.test(message)) { + throw new TypeError('The encoded message should consist only of "A"s, "B"s and whitespaces') + } + + message = message.toUpperCase() + + let result = '' + const messageArray = message.split(' ') + + messageArray.forEach((word, index) => { + for (let i = 0; i < word.length; i += 5) { + const letter = Object.keys(baconianAlphabet).find( + (key) => { + return baconianAlphabet[key] === word.substring(i, i + 5) + } + ) + + if (letter) { + result += letter + } + } + if (index < messageArray.length - 1) { + result += ' ' + } + }) + + return result +} + +export { + baconianEncode, + baconianDecode +} diff --git a/Ciphers/test/BaconianCipher.test.js b/Ciphers/test/BaconianCipher.test.js new file mode 100644 index 0000000000..645a1b756e --- /dev/null +++ b/Ciphers/test/BaconianCipher.test.js @@ -0,0 +1,17 @@ +import { + baconianEncode, + baconianDecode +} from '../BaconianCipher' + +test('"Hello world" === baconianDecode(baconianEncode("Hello world"))', () => { + const word = 'Hello world' + const expectedResult = 'HELLO WORLD' + const result = baconianDecode(baconianEncode(word)) + expect(result).toMatch(expectedResult) +}) + +test('"AABBBAABAAABABBABABBABBBA BABBAABBBABAAABABABBAAABB" === baconianEncode(baconianDecode("AABBBAABAAABABBABABBABBBA BABBAABBBABAAABABABBAAABB"))', () => { + const word = 'AABBBAABAAABABBABABBABBBA BABBAABBBABAAABABABBAAABB' + const result = baconianEncode(baconianDecode(word)) + expect(result).toMatch(word) +}) From 470949fbeff104d3c1da41802392e47984be05d6 Mon Sep 17 00:00:00 2001 From: github-actions <${github_actor}@users.noreply.github.com> Date: Tue, 3 Oct 2023 14:02:59 +0000 Subject: [PATCH 2/2] Updated Documentation in README.md --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 2d70c5d6a2..f648068452 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -25,6 +25,7 @@ * **Ciphers** * [AffineCipher](Ciphers/AffineCipher.js) * [Atbash](Ciphers/Atbash.js) + * [BaconianCipher](Ciphers/BaconianCipher.js) * [CaesarCipher](Ciphers/CaesarCipher.js) * [KeyFinder](Ciphers/KeyFinder.js) * [KeywordShiftedAlphabet](Ciphers/KeywordShiftedAlphabet.js) @@ -47,6 +48,7 @@ * [HexToBinary](Conversions/HexToBinary.js) * [HexToDecimal](Conversions/HexToDecimal.js) * [HexToRGB](Conversions/HexToRGB.js) + * [LengthConversion](Conversions/LengthConversion.js) * [LitersToImperialGallons](Conversions/LitersToImperialGallons.js) * [LitersToUSGallons](Conversions/LitersToUSGallons.js) * [LowerCaseConversion](Conversions/LowerCaseConversion.js) @@ -233,6 +235,7 @@ * [PowLogarithmic](Maths/PowLogarithmic.js) * [PrimeCheck](Maths/PrimeCheck.js) * [PrimeFactors](Maths/PrimeFactors.js) + * [QuadraticRoots](Maths/QuadraticRoots.js) * [RadianToDegree](Maths/RadianToDegree.js) * [ReverseNumber](Maths/ReverseNumber.js) * [ReversePolishNotation](Maths/ReversePolishNotation.js)

AltStyle によって変換されたページ (->オリジナル) /