Search code examples
erlangelixir

Elixir: Split list into odd and even elements as two items in tuple


I am quiet new to Elixir programming and stuck badly at splitting into two elements tuple.

Given a list of integers, return a two element tuple. The first element is a list of the even numbers from the list. The second is a list of the odd numbers.

Input : [ 1, 2, 3, 4, 5 ]
Output  { [ 2, 4],  [ 1, 3, 5 ] }

I have reached to identify the odd or even but not sure how do I proceed.

defmodule OddOrEven do
import Integer

  def task(list) do

Enum.reduce(list, [],  fn(x, acc) -> 
         case Integer.is_odd(x) do
            :true -> # how do I get this odd value listed as a tuple element
            :false -> # how do I get this even value listed as a tuple element
         end
        #IO.puts(x)
         end
    )     
end

Solution

  • You can use Enum.partition/2:

    iex(1)> require Integer
    iex(2)> [1, 2, 3, 4, 5] |> Enum.partition(&Integer.is_even/1)
    {[2, 4], [1, 3, 5]}
    

    If you really want to use Enum.reduce/2, you can do this:

    iex(3)> {evens, odds} = [1, 2, 3, 4, 5] |> Enum.reduce({[], []}, fn n, {evens, odds} ->
    ...(3)>   if Integer.is_even(n), do: {[n | evens], odds}, else: {evens, [n | odds]}
    ...(3)> end)
    {[4, 2], [5, 3, 1]}
    iex(4)> {Enum.reverse(evens), Enum.reverse(odds)}
    {[2, 4], [1, 3, 5]}