2016-09-19 10 views
6

Jestem cicho nowy w programowaniu Elixir i utknąłem źle przy dzieleniu na dwie elementy.Eliksir: Podziel listę na nieparzyste i parzyste elementy, jako dwie rzeczy w krotce

Biorąc pod listę liczb całkowitych, zwróć krotkę dwu elementową. Pierwszym elementem jest lista liczb parzystych z listy. Druga to lista liczb nieparzystych.

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

Doszedłem do ustalenia, czy jestem dziwny, a może nawet nie wiem, jak postępować.

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 

Odpowiedz

12

Można użyć 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]} 

Jeśli naprawdę chcesz używać Enum.reduce/2, można to zrobić:

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]} 
+1

It Warto zauważyć, że funkcja 'Enum.partition/2' została uznana za przestarzałą na rzecz' Enum.split_with/2' – michalmuskala

2

Albo można użyć modułu Erlang :lists:

iex> :lists.partition(fn (n) -> rem(n, 2) == 1 end, [1,2,3,4,5]) 
{[1,3,5],[2,4]} 
Powiązane problemy