# HackerRank Ruby Array - Selection problem solution

In this HackerRank Ruby Array - Selection problem solution The array class also allows to selection and return a subset of an array based on some criteria defined in a block (a block is a group of code within {} that accepts a variable and returns a value).

Selecting elements that satisfy a given criteria

Rejecting elements that satisfy a given criteria

> arr = [3, 4, 2, 1, 2, 3, 4, 5, 6]

> arr.select {|a| a > 2}

=> [3, 4, 3, 4, 5, 6]

> arr.reject {|a| a > 2}

=> [2, 1, 2]

> arr

=> [3, 4, 2, 1, 2, 3, 4, 5, 6]

> arr.drop_while {|a| a > 1} # removes elements till the block returns false for the first time

=> [1, 2, 3, 4, 5, 6]

As you can see, the original array remains unchanged. This is called Non-Destructive Selection.

For destructive behavior (change to the original array), Ruby provides the following methods:

> arr = [3, 4, 2, 1, 2, 3, 4, 5, 6]

> arr.delete_if {|a| a < 2}

=> [3, 4, 2, 2, 3, 4, 5, 6]

> arr.keep_if {|a| a < 4}

=> [3, 2, 2, 3]

Note

An element in a block is selected, rejected, deleted, or kept based on the True or False value generated by that block on that element.

For a destructive behavior for select and reject or any method that one wants to enforce a change in the original array, a ! can be used at the end of the method i.e., select! and reject!

In this challenge, you have to complete the functions using syntax as explained above.

## Problem solution.

```def select_arr(arr)
# select and return all odd numbers from the Array variable `arr`
arr.select do |n|
n.odd?
end

end

def reject_arr(arr)
# reject all elements which are divisible by 3
arr.reject do |n|
n % 3 == 0
end
end

def delete_arr(arr)
arr.delete_if do |n|
n < 0
end
# delete all negative elements
end

def keep_arr(arr)
arr.keep_if { |n| n >= 0 }
# keep all non negative elements ( >= 0)
end
```