2016-09-19 7 views
6

में दो आइटम के रूप में अजीब और यहां तक ​​कि तत्वों को विभाजित करें, मैं इलीक्सिर प्रोग्रामिंग के लिए नया हूं और दो तत्वों में विभाजित होने पर बुरी तरह अटक गया हूं।इलीक्सिर: टप्ले

पूर्णांक की एक सूची को देखते हुए, दो तत्व tuple वापस करें। पहला तत्व सूची से भी संख्याओं की एक सूची है। दूसरा विषम संख्याओं की एक सूची है।

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

मैं विषम या यहां तक ​​कि यह सुनिश्चित करने के लिए पहुंच गया हूं कि मैं कैसे आगे बढ़ूं।

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 

उत्तर

12

आप 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]} 

तुम सच में Enum.reduce/2 का उपयोग करना चाहते हैं, तो आप ऐसा कर सकते हैं:

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

यह यह ध्यान देने योग्य है कि 'Enum.pplition/2' फ़ंक्शन को' Enum.split_with/2' के पक्ष में बहिष्कृत किया गया था – michalmuskala

2

या आप Erlang :lists मॉड्यूल का उपयोग कर सकते हैं:

iex> :lists.partition(fn (n) -> rem(n, 2) == 1 end, [1,2,3,4,5]) 
{[1,3,5],[2,4]} 
संबंधित मुद्दे