Home > katas > Counting sheep... (8kyu) [Ruby]

Counting sheep... (8kyu) [Ruby]


Chek kata on Codewars

Description:

Consider an array/list of sheep where some sheep may be missing from their place. We need a function that counts the number of sheep present in the array (true means present).

For example,

[true,  true,  true,  false,
  true,  true,  true,  true ,
  true,  false, true,  false,
  true,  false, false, true ,
  true,  true,  true,  true ,
  false, false, true,  true]
The correct answer would be 17.

Hint: Don't forget to check for bad values like null/undefined

Solution 1

Let's start with loop solutions.

def countSheeps array
    amount = 0
    for sheep in array
        if (sheep == true)
            amount += 1
        end
    end
    return amount
end

Solution 2

Let's solve it with count().

def countSheeps array
    array.count(true)
end

count() is a Array class method which returns the number of elements in the array. It can also find the total number of a particular element in the array.

Solution 3

Let's solve it with map().

def countSheeps array
    array.map{ |sheep| sheep ? sheep : nil }.compact.length
end

map() is a Array class method which returns a new array containing the values returned by the block.

compact() is a Array class method which returns the array after removing all the ‘nil’ value elements (if any) from the array.

Solution 4

Let's solve it with select().

def countSheeps array
    array.select{ |sheep| sheep == true }.length
end

select() is a Array class method which returns a new array containing all elements of array for which the given block returns a true value.

Solution 5

Let's solve it with reduce().

def countSheeps array
    array.reduce(0) {|acc, cur| cur.nil? || !cur ? acc : acc  + 1}
end
© 2021, Andrew Losseff