From 979046897dd6aed962cd50f3946a6e4dc7c00fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Fern=C3=A1ndez=20Serrata?= <76864299+Rudxain@users.noreply.github.com> Date: Fri, 12 Aug 2022 13:44:25 -0400 Subject: [PATCH] merge: Edit `Perfect{Square, Cube}` (#1071) * Make `PerfectCube` more correct and readable * Add negative and Infinity tests * Fixed comment formatting * Realized BigInt support is unnecessary The algorithm would be exactly the same, so there's no added educational value * Update PerfectCube.js * Remove space * Update PerfectCube.js Now `isInt` is replaced by `isFinite`, because `isInt` is a redundant check * Update PerfectCube.js Remove dot * Parity between `PerfectSquare` and `PerfectCube` * Update PerfectSquare.test.js Fixed the old copy-paste error that said "cube" instead of "square". And added `Infinity` test --- Maths/PerfectCube.js | 3 ++- Maths/PerfectSquare.js | 3 ++- Maths/test/PerfectCube.test.js | 2 ++ Maths/test/PerfectSquare.test.js | 5 +++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Maths/PerfectCube.js b/Maths/PerfectCube.js index bbfc821e2..67e119305 100644 --- a/Maths/PerfectCube.js +++ b/Maths/PerfectCube.js @@ -2,8 +2,9 @@ * Author: dephraiim * License: GPL-3.0 or later * + * This uses `round` instead of `floor` or `trunc`, to guard against potential `cbrt` accuracy errors */ -const perfectCube = (num) => Math.round(num ** (1 / 3)) ** 3 === num +const perfectCube = (num) => Number.isFinite(num) && Math.round(Math.cbrt(num)) ** 3 === num export { perfectCube } diff --git a/Maths/PerfectSquare.js b/Maths/PerfectSquare.js index d4909dbd4..9003ec141 100644 --- a/Maths/PerfectSquare.js +++ b/Maths/PerfectSquare.js @@ -2,8 +2,9 @@ * Author: dephraiim * License: GPL-3.0 or later * + * This uses `round` instead of `floor` or `trunc`, to guard against potential `sqrt` accuracy errors */ -const perfectSquare = (num) => Math.sqrt(num) ** 2 === num +const perfectSquare = (num) => Number.isFinite(num) && Math.round(Math.sqrt(num)) ** 2 === num export { perfectSquare } diff --git a/Maths/test/PerfectCube.test.js b/Maths/test/PerfectCube.test.js index ff4b74f8f..f3c4f219e 100644 --- a/Maths/test/PerfectCube.test.js +++ b/Maths/test/PerfectCube.test.js @@ -3,8 +3,10 @@ import { perfectCube } from '../PerfectCube' describe('PerfectCube', () => { it('should return true for a perfect cube', () => { expect(perfectCube(125)).toBeTruthy() + expect(perfectCube(-125)).toBeTruthy() }) it('should return false for a non perfect cube', () => { expect(perfectCube(100)).toBeFalsy() + expect(perfectCube(Infinity)).toBeFalsy() }) }) diff --git a/Maths/test/PerfectSquare.test.js b/Maths/test/PerfectSquare.test.js index 86c8c3403..37fce248d 100644 --- a/Maths/test/PerfectSquare.test.js +++ b/Maths/test/PerfectSquare.test.js @@ -1,10 +1,11 @@ import { perfectSquare } from '../PerfectSquare' describe('PerfectSquare', () => { - it('should return true for a perfect cube', () => { + it('should return true for a perfect square', () => { expect(perfectSquare(16)).toBeTruthy() }) - it('should return false for a non perfect cube', () => { + it('should return false for a non perfect square', () => { expect(perfectSquare(10)).toBeFalsy() + expect(perfectSquare(Infinity)).toBeFalsy() }) })