Everyone Can Code!

JavaScript Kata #40: Factorial Factory

By YayoDrayber | Learn To Code With Me | 25 Sep 2022


If you missed the introductory post, it's here. For a list of previously solved katas, please refer to the bottom of this page.

If this is your first time seeing my post, please note - these katas are probably randomly assigned per user so please don't go into Codewars thinking we will have exactly the same user experience, I am just posting these in the order that I got them.

Kata #40

DESCRIPTION:

In mathematics, the factorial of integer 'n' is written as 'n!'. It is equal to the product of n and every integer preceding it. For example: 5! = 1 x 2 x 3 x 4 x 5 = 120

Your mission is simple: write a function that takes an integer 'n' and returns 'n!'.

You are guaranteed an integer argument. For any values outside the positive range, return nullnil or None .

Note: 0! is always equal to 1. Negative values should return null;

For more on Factorials : http://en.wikipedia.org/wiki/Factorial

Starting code:

//This function should return n!
function factorial (n) {
  
}

My attempt that worked:

//This function should return n!
function factorial (n) {
  let result = 1
  if (n > 0) {
    for (i = n ; i > 1  ; i--){
    result *= i 
    } 
    return result
  } else if (n == 0){return 1}
    else {return null}
}

Rank #1 in 'Best Practices':

//This function should return n!
function factorial (n) {
  if (n > -1)
    return n == 0 ? 1 : n * factorial(n - 1);
}

Wow. Gotta admit I got got. Also have to admit I had to look up if there was a built-in factorial function (there wasn't) and realized this was my first taste of recursion challenge in the wild. Although the code I cooked up worked, I'm jealous of those that looks so much cleaner.

Rank #2 also a recursion:

//This function should return n!
function factorial (n) {
  if (n < 0) return null;
  if (n === 0) return 1;
  
  return n * factorial(--n)
}

Rank #3 exactly the same as rank #2 but somehow got detected as different, with the difference only being spaces and semicolons:

//This function should return n!
function factorial (n) {
  if (n < 0) return null
  if (n === 0) return 1
  return n * factorial(n-1)
}

Rank #4 with yet another recursion :

//This function should return n!
function factorial(n) {
  return n>=0 ? n ? n*factorial(n-1) : 1 : null;
}

I mistakenly thought I couldn't use .reduce() because the argument passed to the function is not an array but rank #5 by user andorey demonstrates it here:

// n!
function factorial (n) {
 return n < 0 ? null : Array.from({length: n}, (_,i)=> i+1).reduce((a,b)=> a*b,1) 
}

Rank #6 with a for loop by user g964:

function factorial(n) {
    if (n < 0) return null;
    var val = 1;
    for (var i = 2; i <= n; i++)
        val = val * i;
    return val;
}

Then ranks #7 to #10 also used the recursive solution. Which should probably beg the question, why didn't I think of that? Well because recursion hasn't come up yet in my study material, that's why ¯\_(ツ)_/¯ 🤣 

That's it for Kata #40, stay tuned for more katas to be solved!

Link to Kata #1: Square(n) Sum

Link to Kata #2: Convert a Number to a String

Link to Kata #3: DNA to RNA Conversion

Link to Kata #4: Remove First and Last Character

Link to Kata #5: MakeUpperCase

Link to Kata #6: Total amount of points

Link to Kata #7: A Needle in the Haystack

Link to Kata #8: Sum of positive

Link to Kata #9: Basic Mathematical Operations

Link to Kata #10: Beginner - Reduce but Grow

Link to Kata #11: Square Every Digit

Link to Kata #12: Friend or Foe?

Link to Kata #13: Grasshopper - Summation

Link to Kata #14: Get the Middle Character

Link to Kata #15: Descending Order

Link to Kata #16: String ends with?

Link to Kata #17: Sum of two lowest positive integers

Link to Kata #18: Sum of odd numbers

Link to Kata #19: Find the next perfect square!

Link to Kata #20: Reversed Strings

Link to Kata #21: Jaden Casing Strings

Link to Kata #22: Even or Odd

Link to Kata #23: Returning Strings

Link to Kata #24: Opposite number

Link to Kata #25: Are You Playing Banjo?

Link to Kata #26: Beginner Series #1 School Paperwork

Link to Kata #27: Remove String Spaces

Link to Kata #28: Invert values

Link to Kata #29: Count by X

Link to Kata #30: Beginner Series #2 Clock

Link to Kata #31: Is this a triangle?

Link to Kata #32: Sum of the first nth term of Series

Link to Kata #33: Find the smallest integer in the array

Link to Kata #34: Simple multiplication

Link to Kata #35: How good are you really?

Link to Kata #36: Who likes it?

Link to Kata #37: Convert a String to a Number!

Link to Kata #38: Highest and Lowest

Link to Kata #39: Equal Sides Of An Array

Resources

  1. https://www.publish0x.com/learn-to-code-with-me/obligatory-introductory-post-xddgyxl
  2. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-1-squaren-sum-xvmywpl
  3. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-2-convert-a-number-to-a-string-xmymkwm
  4. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-3-dna-to-rna-conversion-xgjlpox
  5. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-4-remove-first-and-last-character-xyeyykj
  6. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-5-makeuppercase-xzgnnqd
  7. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-6-total-amount-of-points-xeellvx
  8. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-7-a-needle-in-the-haystack-xlqzzgp
  9. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-8-sum-of-positive-xxzyyrl
  10. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-9-basic-mathematical-operations-xlqzzer
  11. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-10-beginner-reduce-but-grow-xxzyylv
  12. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-11-square-every-digit-xnnxxyr
  13. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-12-friend-or-foe-xddggmm
  14. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-13-grasshopper-summation-xnnxxwr
  15. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-14-get-the-middle-character-xrgnney
  16. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-15-descending-order-xmymmwn
  17. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-16-string-ends-with-xeelnpk
  18. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-17-sum-of-two-lowest-positive-integers-xjroxpn
  19. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-18-sum-of-odd-numbers-xeelnwk
  20. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-19-find-the-next-perfect-square-xozowvo
  21. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-20-reversed-strings-xvmyqyn
  22. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-21-jaden-casing-strings-xwywdwd
  23. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-22-even-or-odd-xwywdvd
  24. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-23-returning-strings-xeelxvw
  25. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-24-opposite-number-xxzyerp
  26. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-25-are-you-playing-banjo-xjrowyk
  27. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-26-beginner-series-1-school-paperwork-xxzyelp
  28. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-27-remove-string-spaces-xjrowqk
  29. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-28-invert-values-xnnxgwx
  30. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-29-count-by-x-xyeyzjz
  31. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-30-beginner-series-2-clock-xddgwmj
  32. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-31-is-this-a-triangle-xjrowxk
  33. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-32-sum-of-the-first-nth-term-of-series-xzgnjex
  34. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-33-find-the-smallest-integer-in-the-array-xpzpkkx
  35. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-34-simple-multiplication-xvmyqqd
  36. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-35-how-good-are-you-really-xjrowwz
  37. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-36-who-likes-it-xmymelp
  38. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-37-convert-a-string-to-a-number-xpzpkop
  39. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-38-highest-and-lowest-xyeyrkv
  40. https://www.publish0x.com/learn-to-code-with-me/javascript-kata-39-equal-sides-of-an-array-xgjlmpv

How do you rate this article?

3


YayoDrayber
YayoDrayber

A Yayo, A Drayber, among others.


Learn To Code With Me
Learn To Code With Me

Just started with Codewars and will be posting the solutions I came up with here and the apparent best practices.

Send a $0.01 microtip in crypto to the author, and earn yourself as you read!

20% to author / 80% to me.
We pay the tips from our rewards pool.