2017-08-29 54 views
0

給出Alice的三元組和Bob的三元組(列表),我需要比較每個元素,所以如果alice_triplet[i]>bob_triplet[i],Alice的分數增加1,反之亦然。比較和減少兩個列表中的對

我有這樣的代碼:

def main do 
    alice_triplet = [5, 6, 7] 
    bob_triplet = [3, 6, 10] 

    alice_score = 0 
    bob_score = 0 

    Enum.zip(alice_triplet, bob_triplet) 
    |> Enum.each(fn 
     tuple when elem(tuple, 0) > elem(tuple, 1) -> alice_score = alice_score + 1 
     tuple when elem(tuple, 1) > elem(tuple, 0) -> bob_score = bob_score + 1 
     _ -> nil end) 

    IO.puts alice_score 
    IO.puts bob_score 

end 

但是,輸出是:

0 
0 

爲什麼?我認爲這是對變量的作用域,因爲我得到這樣的警告:

警告:變速「alice_score」未使用solution.ex:12

警告:變速「bob_score」未使用solution.ex :13

是否有「更多功能」的方式來做到這一點?我正在學習Elixir(實際上一般情況下是FP),所以任何建議都將值得讚賞。

回答

2

聲明alice_score = alice_score + 1不修改外alice_score,它會創建一個新的本地alice_score設置爲外值+ 1,這已覆蓋manyanswers值。解決方案几乎總是使用Enum.reduce/3,您需要更改用作累加器的狀態。

這裏是如何可以應用到你的代碼:

alice_triplet = [5, 6, 7] 
bob_triplet = [3, 6, 10] 

{alice_score, bob_score} = Enum.zip(alice_triplet, bob_triplet) |> 
Enum.reduce({0, 0}, fn 
    tuple, {as, bs} when elem(tuple, 0) > elem(tuple, 1) -> {as + 1, bs} 
    tuple, {as, bs} when elem(tuple, 1) > elem(tuple, 0) -> {as, bs + 1} 
    _, {as, bs} -> {as, bs} 
end) 

IO.puts alice_score 
IO.puts bob_score 

您還可以使用模式,而不是匹配的elem/2簡化代碼(elem/2中慣用的藥劑代碼很少使用):

alice_triplet = [5, 6, 7] 
bob_triplet = [3, 6, 10] 

{alice_score, bob_score} = Enum.zip(alice_triplet, bob_triplet) |> 
Enum.reduce({0, 0}, fn 
    {a, b}, {as, bs} when a > b -> {as + 1, bs} 
    {a, b}, {as, bs} when b > a -> {as, bs + 1} 
    _, {as, bs} -> {as, bs} 
end) 

IO.puts alice_score 
IO.puts bob_score 

這兩種情況下的輸出是

1 
1 
+0

太好了!非常感謝! –