merge: Upgraded Algorithm of alpha numeric palindrome (#1006)

* 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: used replace method & added test case

* feat: remove revert

* chore: added new line

* feat: optimized algo n to n / 2 & replaced test cases

* chore: update node version

* chore: set node version to lts

* chore: updated the node version & added engines prop

* resolve: removed while loop

* chore: added right shift ops comment

* chore: update comment

* chore: removed abs

Co-authored-by: Rak Laptudirm <raklaptudirm@gmail.com>
This commit is contained in:
Fahim Faisaal
2022-05-07 18:12:50 +06:00
committed by GitHub
parent e05b4432d8
commit cbc669aa9d
5 changed files with 48 additions and 39 deletions

View File

@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: "14" node-version: "16.x"
cache: npm cache: npm
- name: 📦 Install dependencies - name: 📦 Install dependencies

View File

@ -1,11 +1,11 @@
/***************************************************************************** /**
* @function alphaNumericPlaindrome * @function alphaNumericPalindrome
* @description alphaNumericPlaindrome should return true if the string has alphanumeric characters that are palindrome irrespective of special characters and the letter case. * @description alphaNumericPalindrome should return true if the string has alphanumeric characters that are palindrome irrespective of special characters and the letter case.
* @param {string} str the string to check * @param {string} str the string to check
* @returns {Boolean} * @returns {boolean}
* @see [Factorial](https://en.wikipedia.org/wiki/Palindrome) * @see [Palindrome](https://en.wikipedia.org/wiki/Palindrome)
* @example * @example
* The function alphaNumericPlaindrome() receives a string with varying formats * The function alphaNumericPalindrome() receives a string with varying formats
* like "racecar", "RaceCar", and "race CAR" * like "racecar", "RaceCar", and "race CAR"
* The string can also have special characters * The string can also have special characters
* like "2A3*3a2", "2A3 3a2", and "2_A3*3#A2" * like "2A3*3a2", "2A3 3a2", and "2_A3*3#A2"
@ -13,15 +13,18 @@
* But the catch is, we have to check only if the alphanumeric characters * But the catch is, we have to check only if the alphanumeric characters
* are palindrome i.e remove spaces, symbols, punctuations etc * are palindrome i.e remove spaces, symbols, punctuations etc
* and the case of the characters doesn't matter * and the case of the characters doesn't matter
* */
****************************************************************************/ const alphaNumericPalindrome = (str) => {
if (typeof str !== 'string') {
throw new TypeError('Argument should be string')
}
const alphaNumericPlaindrome = (str) => {
// removing all the special characters and turning everything to lowercase // removing all the special characters and turning everything to lowercase
const newStr = str.replace(/[^a-zA-Z0-9]*/g, '').toLowerCase() const newStr = str.replace(/[^a-z0-9]+/ig, '').toLowerCase()
const midIndex = newStr.length >> 1 // x >> y = floor(x / 2^y)
for (let i = 0; i < newStr.length; i++) { for (let i = 0; i < midIndex; i++) {
if (newStr[i] !== newStr[newStr.length - 1 - i]) { if (newStr.at(i) !== newStr.at(~i)) { // ~n = -(n + 1)
return false return false
} }
} }
@ -29,4 +32,4 @@ const alphaNumericPlaindrome = (str) => {
return true return true
} }
export { alphaNumericPlaindrome } export default alphaNumericPalindrome

View File

@ -1,21 +1,21 @@
import { alphaNumericPlaindrome } from '../AlphaNumericPalindrome' import alphaNumericPalindrome from '../AlphaNumericPalindrome'
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => { describe('Testing the alpha numeric palindrome', () => {
expect(alphaNumericPlaindrome('eye')).toBe(true) // should return true if the given string has alphanumeric characters that are palindrome irrespective of case and symbols
}) it('Testing with valid alphabetic palindrome', () => {
expect(alphaNumericPalindrome('eye')).toBe(true)
expect(alphaNumericPalindrome('Madam')).toBe(true)
expect(alphaNumericPalindrome('race CAR')).toBe(true)
expect(alphaNumericPalindrome('A man, a plan, a canal. Panama')).toBe(true)
})
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => { it('Testing with number and symbol', () => {
expect(alphaNumericPlaindrome('0_0 (: /-:) 0-0')).toBe(true) expect(alphaNumericPalindrome('0_0 (: /-:) 0-0')).toBe(true)
}) expect(alphaNumericPalindrome('03_|53411435|_30')).toBe(true)
})
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => { it('Testing with alphabets and symbols', () => {
expect(alphaNumericPlaindrome('five|_/|four')).toBe(false) expect(alphaNumericPalindrome('five|_/|evif')).toBe(true)
}) expect(alphaNumericPalindrome('five|_/|four')).toBe(false)
})
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
expect(alphaNumericPlaindrome('A man, a plan, a canal. Panama')).toBe(true)
})
test('should return true if the given string has alphanumeric characters that are palindrom irrespective of case and symbols', () => {
expect(alphaNumericPlaindrome('1 eye for of 1 eye.')).toBe(false)
}) })

17
package-lock.json generated
View File

@ -14,7 +14,7 @@
"@babel/preset-env": "^7.11.5", "@babel/preset-env": "^7.11.5",
"atob": "2.1.2", "atob": "2.1.2",
"jsdom": "^16.3.0", "jsdom": "^16.3.0",
"node": "^14.13.1", "node": "^16.13.2",
"node-fetch": "3.1.1" "node-fetch": "3.1.1"
}, },
"devDependencies": { "devDependencies": {
@ -25,6 +25,9 @@
"husky": "^7.0.4", "husky": "^7.0.4",
"jest": "^26.4.2", "jest": "^26.4.2",
"standard": "^16.0.4" "standard": "^16.0.4"
},
"engines": {
"node": ">=16.6.0"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
@ -8121,9 +8124,9 @@
"dev": true "dev": true
}, },
"node_modules/node": { "node_modules/node": {
"version": "14.18.1", "version": "16.13.2",
"resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz", "resolved": "https://registry.npmjs.org/node/-/node-16.13.2.tgz",
"integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==", "integrity": "sha512-6x0hohLASL0XaehYn1mrVw1UiiRjoxrujBxjqHGxGe/rFKKCJcDhoa5wNxxvBbyJm6mNgZYuzg0JTwvXmpeWWw==",
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"node-bin-setup": "^1.0.0" "node-bin-setup": "^1.0.0"
@ -17157,9 +17160,9 @@
"dev": true "dev": true
}, },
"node": { "node": {
"version": "14.18.1", "version": "16.13.2",
"resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz", "resolved": "https://registry.npmjs.org/node/-/node-16.13.2.tgz",
"integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==", "integrity": "sha512-6x0hohLASL0XaehYn1mrVw1UiiRjoxrujBxjqHGxGe/rFKKCJcDhoa5wNxxvBbyJm6mNgZYuzg0JTwvXmpeWWw==",
"requires": { "requires": {
"node-bin-setup": "^1.0.0" "node-bin-setup": "^1.0.0"
} }

View File

@ -17,7 +17,7 @@
"@babel/preset-env": "^7.11.5", "@babel/preset-env": "^7.11.5",
"atob": "2.1.2", "atob": "2.1.2",
"jsdom": "^16.3.0", "jsdom": "^16.3.0",
"node": "^14.13.1", "node": "^16.13.2",
"node-fetch": "3.1.1" "node-fetch": "3.1.1"
}, },
"standard": { "standard": {
@ -34,5 +34,8 @@
"husky": "^7.0.4", "husky": "^7.0.4",
"jest": "^26.4.2", "jest": "^26.4.2",
"standard": "^16.0.4" "standard": "^16.0.4"
},
"engines": {
"node": ">=16.6.0"
} }
} }