mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-06 01:18:23 +08:00
merge: Improved ROT13
function (#964)
* feat: improved memoize function used Map instead of object & used the JSON.stringfy method for generate a valid string as a key * docs: modified documentation * style: format with standard * docs: modified stringify doc * refactor: remove two repetition implementation * feat: added validation, test codes * chore: remove useless words * feat: added types for jest * chore: added link box * feat: added new validation test casses & methods * style: formated with standard * feat: added parse method & test cases * docs: added js docs * chore: added default import export * feat: imporved algorithm via replace method * test: added two test cases * feat: added jest type for suggestions * feat: added `reduceRight` & `trim` method * chore: added helper variable * feat: added new rotation option * Revert "chore: added helper variable" This reverts commit 489544da0a3d479910fbea020d3be3d0d10681bf. * remove: yarn lock * chore: fix grammer * feat: remove revert * chore: added new line
This commit is contained in:
@ -1,17 +1,24 @@
|
|||||||
/**
|
/**
|
||||||
* Transcipher a ROT13 cipher
|
* @function ROT13
|
||||||
* @param {String} text - string to be encrypted
|
* @description - ROT13 ("rotate by 13 places", sometimes hyphenated ROT-13) is a simple letter substitution cipher that replaces a letter with the 13th letter after it in the alphabet. ROT13 is a special case of the Caesar cipher which was developed in ancient Rome. Because there are 26 letters (2×13) in the basic Latin alphabet, ROT13 is its own inverse; that is, to undo ROT13, the same algorithm is applied, so the same action can be used for encoding and decoding. The algorithm provides virtually no cryptographic security, and is often cited as a canonical example of weak encryption.
|
||||||
* @return {String} - decrypted string
|
* @see - [wiki](https://en.wikipedia.org/wiki/ROT13)
|
||||||
|
* @param {String} str - string to be decrypted
|
||||||
|
* @return {String} decrypted string
|
||||||
*/
|
*/
|
||||||
const ROT13 = (text) => {
|
function ROT13 (str) {
|
||||||
const originalCharacterList = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
|
if (typeof str !== 'string') {
|
||||||
const toBeMappedCharaterList = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
|
throw new TypeError('Argument should be string')
|
||||||
const index = x => originalCharacterList.indexOf(x)
|
}
|
||||||
const replace = x => index(x) > -1 ? toBeMappedCharaterList[index(x)] : x
|
|
||||||
return text.split('').map(replace).join('')
|
return str.replace(/[a-z]/gi, (char) => {
|
||||||
|
const charCode = char.charCodeAt()
|
||||||
|
|
||||||
|
if (/[n-z]/i.test(char)) {
|
||||||
|
return String.fromCharCode(charCode - 13)
|
||||||
|
}
|
||||||
|
|
||||||
|
return String.fromCharCode(charCode + 13)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export { ROT13 }
|
export default ROT13
|
||||||
|
|
||||||
// > ROT13('The quick brown fox jumps over the lazy dog')
|
|
||||||
// 'Gur dhvpx oebja sbk whzcf bire gur ynml qbt'
|
|
||||||
|
18
Ciphers/test/ROT13.test.js
Normal file
18
Ciphers/test/ROT13.test.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import ROT13 from '../ROT13'
|
||||||
|
|
||||||
|
describe('Testing ROT13 function', () => {
|
||||||
|
it('Test - 1, passing a non-string as an argument', () => {
|
||||||
|
expect(() => ROT13(0x345)).toThrow()
|
||||||
|
expect(() => ROT13(123)).toThrow()
|
||||||
|
expect(() => ROT13(123n)).toThrow()
|
||||||
|
expect(() => ROT13(false)).toThrow()
|
||||||
|
expect(() => ROT13({})).toThrow()
|
||||||
|
expect(() => ROT13([])).toThrow()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Test - 2, passing a string as an argument', () => {
|
||||||
|
expect(ROT13('Uryyb Jbeyq')).toBe('Hello World')
|
||||||
|
expect(ROT13('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')).toBe('NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')
|
||||||
|
expect(ROT13('The quick brown fox jumps over the lazy dog')).toBe('Gur dhvpx oebja sbk whzcf bire gur ynml qbt')
|
||||||
|
})
|
||||||
|
})
|
Reference in New Issue
Block a user