re: Daily Coding Puzzles - Nov 4th - Nov 9th VIEW POST



Product of Array Items (7 KYU):

Calculate the product of all elements in an array.



A simple aggregation of data (using reduce) worked like a charm.

C# answer.

namespace Kata {
  using System;
  using System.Linq;
  public class ArrayMath
    public static int Product(int[] values)
      return values.Aggregate((product, current) => product * current);


product' :: Num a => [a] -> a
product' = product


const product = arr => arr.reduce((acc, x) => acc * x)


let product arr =
    arr |> Array.reduce (*)

I probably wouldn't define a separate function for this in actual code.


Does F# require you to name the arr parameter explicitly or can you simply do the following:

let product = Array.reduce (*)

I've been curious about F# for some time but haven't really done a deep dive.

Yes, you can do that in F#. (You probably know this, but for the sake of onlookers) it is called point-free notation. It can be handy for small functions like this. But I noticed when I use it too much, my code can become hard to understand.

Especially for code examples, I rarely use it because it can confuse readers.



def product(numbers):
    if not numbers: return None
    running_product = 1
    for number in numbers:
        running_product *= number
    return running_product
def product (numbers):
  return reduce(lambda total, number: total * number, numbers)

Common Lisp

as * in Common Lisp can take as many arguments as you like...

(apply #'* (list 1 2 3 4 5))
;; => 120


func Product(nums []int)(x int) {
    x = 1

    for _, num := range nums {
        x *= num


I decided to not use reduce so that I could return early if I hit a zero.

function product(values) {
  if(!values || values.length === 0) return null;
  let prod = values[0];
  for(let i=1; i<values.length; i++) {
    if(values[i] === 0) return 0;
    prod *= values[i];
  return result;


fn product(list: &[i32]) -> i32 {
    list.iter().fold(1, |p, n| p * n)


function arrayProduct(arr) {
    return arr.reduce((acc, val) => acc * val);
Code of Conduct Report abuse