Skip to content

Instantly share code, notes, and snippets.

@Woodsphreaker
Last active June 19, 2017 01:23
Show Gist options
  • Save Woodsphreaker/4b87cd82a096d86193f288e9a54d192e to your computer and use it in GitHub Desktop.
Save Woodsphreaker/4b87cd82a096d86193f288e9a54d192e to your computer and use it in GitHub Desktop.
Prime Number Check
const generateRangeOfNumbers = (start = 0, end = 1) =>
Array.from({ "length": (end + 1) - start }, (notUsed, index) => start + index)
const isInteger = (number) => Number.isInteger(number)
const squareRoot = (number) => Math.sqrt(number)
const isIntegerSqrt = (number) => isInteger(squareRoot(number))
const isBiggerThan = (divisors) => (number) =>
number > Math.max(...divisors)
const mergeInArray = (x, y) => [].concat(x, y)
const hasExactDivisor = (divisor) => (dividend) => divisor % dividend === 0
const hasExactSquareRoot = (number) =>
isIntegerSqrt(number)
? mergeInArray(number, squareRoot(number))
: number
const divisors = generateRangeOfNumbers(1, 9)
const hasBigger = isBiggerThan(divisors)
const allDivisors = (number) =>
hasBigger (number)
? mergeInArray(divisors, hasExactSquareRoot(number))
: divisors
const theNumber = (number) => {
return {
yesIsPrime: `O numero ${number} é primo, pois só existem dois divisores exatos [${primeTest(number)}]`,
notIsPrime: `Ops, o numero ${number} não é primo, pois é divisivel por mais de 2 números inteiros [${primeTest(number)}]`
}
}
const sort = (list) => list.sort((a, b) => a > b)
const primeTest = (number) => sort(allDivisors(number).filter(hasExactDivisor(number)))
const hasONLYTwoDivisors = (number) => primeTest(number).length === 2
const isPrime = (number) =>
hasONLYTwoDivisors(number)
? theNumber(number)["yesIsPrime"]
: theNumber(number)["notIsPrime"]
const tests = [10, 25, 5, 289, 10003, 10004, 100003, 100004, 361]
tests.forEach(number =>
console.log(isPrime(number))
)
/*
Ops, o numero 10 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,5,10]
Ops, o numero 25 não é primo, pois é divisivel por mais de 2 números inteiros [1,5,5,25]
O numero 5 é primo, pois só existem dois divisores exatos [1,5]
Ops, o numero 289 não é primo, pois é divisivel por mais de 2 números inteiros [1,17,289]
Ops, o numero 10003 não é primo, pois é divisivel por mais de 2 números inteiros [1,7,10003]
Ops, o numero 10004 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,4,10004]
O numero 100003 é primo, pois só existem dois divisores exatos [1,100003]
Ops, o numero 100004 não é primo, pois é divisivel por mais de 2 números inteiros [1,2,4,100004]
Ops, o numero 361 não é primo, pois é divisivel por mais de 2 números inteiros [1,19,361]
*/
@Woodsphreaker
Copy link
Author

Finalizei o refat, acho que agora ficou melhor.
Testei alguns casos aqui é acho que está cumprindo o proposto.
Qualquer contribuição será muito bem vinda :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment