From cd6ec65e5428194f07715a80555d4d863599bac7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan <55143799+dephraiim@users.noreply.github.com> Date: Sun, 11 Oct 2020 19:39:20 +0000 Subject: [PATCH] Add Algorithms to Math with tests (#429) * chore: add area and area test * chore: add armstrong number * chore: add factors * chore: add perfect cube * chore: add perfect square * chore: add perfect number * chore: add number of digits * chore: fix according to standardjs * chore: remove conflicting files --- Maths/ArmstrongNumber.js | 24 ++++++++++++++++++++++++ Maths/Factors.js | 16 ++++++++++++++++ Maths/NumberOfDigits.js | 12 ++++++++++++ Maths/PerfectCube.js | 9 +++++++++ Maths/PerfectNumber.js | 30 ++++++++++++++++++++++++++++++ Maths/PerfectSquare.js | 9 +++++++++ Maths/test/ArmstrongNumber.test.js | 14 ++++++++++++++ Maths/test/Factors.test.js | 10 ++++++++++ Maths/test/NumberOfDigits.test.js | 11 +++++++++++ Maths/test/PerfectCube.test.js | 10 ++++++++++ Maths/test/PerfectNumber.test.js | 10 ++++++++++ Maths/test/PerfectSquare.test.js | 10 ++++++++++ 12 files changed, 165 insertions(+) create mode 100644 Maths/ArmstrongNumber.js create mode 100644 Maths/Factors.js create mode 100644 Maths/NumberOfDigits.js create mode 100644 Maths/PerfectCube.js create mode 100644 Maths/PerfectNumber.js create mode 100644 Maths/PerfectSquare.js create mode 100644 Maths/test/ArmstrongNumber.test.js create mode 100644 Maths/test/Factors.test.js create mode 100644 Maths/test/NumberOfDigits.test.js create mode 100644 Maths/test/PerfectCube.test.js create mode 100644 Maths/test/PerfectNumber.test.js create mode 100644 Maths/test/PerfectSquare.test.js diff --git a/Maths/ArmstrongNumber.js b/Maths/ArmstrongNumber.js new file mode 100644 index 000000000..71f448a7f --- /dev/null +++ b/Maths/ArmstrongNumber.js @@ -0,0 +1,24 @@ +/** + * Author: dephraiim + * License: GPL-3.0 or later + * + * An Armstrong number is equal to the sum of the cubes of its digits. + * For example, 370 is an Armstrong number because 3*3*3 + 7*7*7 + 0*0*0 = 370. + * An Armstrong number is often called Narcissistic number. + * + */ + +const armstrongNumber = (num) => { + if (num < 0 || typeof num !== 'number') return false + + let newSum = 0 + + const numArr = num.toString().split('') + numArr.forEach((num) => { + newSum += parseInt(num) ** numArr.length + }) + + return newSum === num +} + +export { armstrongNumber } diff --git a/Maths/Factors.js b/Maths/Factors.js new file mode 100644 index 000000000..68bbde6d2 --- /dev/null +++ b/Maths/Factors.js @@ -0,0 +1,16 @@ +/** + * Author: dephraiim + * License: GPL-3.0 or later + * + * More on Factors: + * https://www.mathsisfun.com/definitions/factor.html + * + */ + +const factorsOfANumber = (number = 0) => { + return Array.from(Array(number + 1).keys()).filter( + (num) => number % num === 0 + ) +} + +export { factorsOfANumber } diff --git a/Maths/NumberOfDigits.js b/Maths/NumberOfDigits.js new file mode 100644 index 000000000..6414c65de --- /dev/null +++ b/Maths/NumberOfDigits.js @@ -0,0 +1,12 @@ +/** + * + * Author: dephraiim + * License: GPL-3.0 or later + * + * Returns the number of digits of a given integer + * + */ + +const numberOfDigit = (n) => Math.abs(n).toString().length + +export { numberOfDigit } diff --git a/Maths/PerfectCube.js b/Maths/PerfectCube.js new file mode 100644 index 000000000..bbfc821e2 --- /dev/null +++ b/Maths/PerfectCube.js @@ -0,0 +1,9 @@ +/** + * Author: dephraiim + * License: GPL-3.0 or later + * + */ + +const perfectCube = (num) => Math.round(num ** (1 / 3)) ** 3 === num + +export { perfectCube } diff --git a/Maths/PerfectNumber.js b/Maths/PerfectNumber.js new file mode 100644 index 000000000..ce8adefb6 --- /dev/null +++ b/Maths/PerfectNumber.js @@ -0,0 +1,30 @@ +/** + * Author: dephraiim + * License: GPL-3.0 or later + * + * == Perfect Number == + * In number theory, a perfect number is a positive integer that is equal to the sum of + * its positive divisors(factors), excluding the number itself. + * For example: 6 ==> divisors[1, 2, 3, 6] + * Excluding 6, the sum(divisors) is 1 + 2 + 3 = 6 + * So, 6 is a Perfect Number + * Other examples of Perfect Numbers: 28, 486, ... + * + * More on Perfect Number: + * https://en.wikipedia.org/wiki/Perfect_number + * + */ + +const factorsExcludingNumber = (n) => { + return [...Array(n).keys()].filter((num) => n % num === 0) +} + +const perfectNumber = (n) => { + const factorSum = factorsExcludingNumber(n).reduce((num, initialValue) => { + return num + initialValue + }, 0) + + return factorSum === n +} + +export { perfectNumber } diff --git a/Maths/PerfectSquare.js b/Maths/PerfectSquare.js new file mode 100644 index 000000000..d4909dbd4 --- /dev/null +++ b/Maths/PerfectSquare.js @@ -0,0 +1,9 @@ +/** + * Author: dephraiim + * License: GPL-3.0 or later + * + */ + +const perfectSquare = (num) => Math.sqrt(num) ** 2 === num + +export { perfectSquare } diff --git a/Maths/test/ArmstrongNumber.test.js b/Maths/test/ArmstrongNumber.test.js new file mode 100644 index 000000000..01da1631d --- /dev/null +++ b/Maths/test/ArmstrongNumber.test.js @@ -0,0 +1,14 @@ +import { armstrongNumber } from '../ArmstrongNumber' + +describe('ArmstrongNumber', () => { + it('should return true for an armstrong number', () => { + expect(armstrongNumber(371)).toBeTruthy() + }) + + it('should return false for a non-armstrong number', () => { + expect(armstrongNumber(300)).toBeFalsy() + }) + it('should return false for negative values', () => { + expect(armstrongNumber(-2)).toBeFalsy() + }) +}) diff --git a/Maths/test/Factors.test.js b/Maths/test/Factors.test.js new file mode 100644 index 000000000..1ad60132d --- /dev/null +++ b/Maths/test/Factors.test.js @@ -0,0 +1,10 @@ +import { factorsOfANumber } from '../Factors' + +describe('Factors', () => { + factorsOfANumber(50).forEach((num) => { + it(`${num} is a factor of 50`, () => { + const isFactor = 50 % num === 0 + expect(isFactor).toBeTruthy() + }) + }) +}) diff --git a/Maths/test/NumberOfDigits.test.js b/Maths/test/NumberOfDigits.test.js new file mode 100644 index 000000000..631e2cce3 --- /dev/null +++ b/Maths/test/NumberOfDigits.test.js @@ -0,0 +1,11 @@ +import { numberOfDigit } from '../NumberOfDigits' + +describe('NumberOfDigits', () => { + it('should return the correct number of digits for an integer', () => { + expect(numberOfDigit(1234000)).toBe(7) + }) + + it('should return the correct number of digits for a negative number', () => { + expect(numberOfDigit(-2346243)).toBe(7) + }) +}) diff --git a/Maths/test/PerfectCube.test.js b/Maths/test/PerfectCube.test.js new file mode 100644 index 000000000..ff4b74f8f --- /dev/null +++ b/Maths/test/PerfectCube.test.js @@ -0,0 +1,10 @@ +import { perfectCube } from '../PerfectCube' + +describe('PerfectCube', () => { + it('should return true for a perfect cube', () => { + expect(perfectCube(125)).toBeTruthy() + }) + it('should return false for a non perfect cube', () => { + expect(perfectCube(100)).toBeFalsy() + }) +}) diff --git a/Maths/test/PerfectNumber.test.js b/Maths/test/PerfectNumber.test.js new file mode 100644 index 000000000..55b7d8426 --- /dev/null +++ b/Maths/test/PerfectNumber.test.js @@ -0,0 +1,10 @@ +import { perfectNumber } from '../PerfectNumber' + +describe('PerfectNumber', () => { + it('should return true for a perfect cube', () => { + expect(perfectNumber(28)).toBeTruthy() + }) + it('should return false for a non perfect cube', () => { + expect(perfectNumber(10)).toBeFalsy() + }) +}) diff --git a/Maths/test/PerfectSquare.test.js b/Maths/test/PerfectSquare.test.js new file mode 100644 index 000000000..86c8c3403 --- /dev/null +++ b/Maths/test/PerfectSquare.test.js @@ -0,0 +1,10 @@ +import { perfectSquare } from '../PerfectSquare' + +describe('PerfectSquare', () => { + it('should return true for a perfect cube', () => { + expect(perfectSquare(16)).toBeTruthy() + }) + it('should return false for a non perfect cube', () => { + expect(perfectSquare(10)).toBeFalsy() + }) +})