學習軌道
/
Elixir
Elixir
/
練習
/
精品店推薦
精品店推薦

精品店推薦

學習練習

簡介

陣列推導式

推導式提供了一種能以宣告式輕鬆轉換 Enumerable 的機制。

要宣告一個最簡單的推導式,可以使用 for 關鍵字,後面接著一個 產生器,以及一個會根據列舉值建立新值的 do 區塊。

for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]

推導式也可以有 篩選條件。沒有通過篩選條件的值,會從最終的陣列中被移除:

for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]

我們可以跨越多行,宣告更複雜的推導式:

for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
    rem(number, 2) == 0 do
  atom
end

# => [:b, :d]

使用多個產生器可以建立 笛卡兒積。也就是說,第一個產生器產生的每個值,都會和第二個產生器產生的每個值配對一次:

for x <- [0, 1],
    y <- [0, 1] do
  {x, y}
end

# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]

說明

你在線上時尚精品店的工作還在持續。你想到一個網站功能的點子,可以為使用者推薦穿搭。雖然你想提供大量的推薦,但你不希望給出糟糕的建議,所以你決定使用陣列推導式,因為這樣就能輕鬆_產生_穿搭組合,再依某些條件_篩選_它們。

衣物項目以映射的形式儲存:

%{
  item_name: "Descriptive Name",
  price: 99.00,
  color: "Ochre Red",
  base_color: "red"
}

1. 推薦一個組合

實作get_combinations/3,讓它接受一份上衣的陣列、一份下著的陣列,以及一份選項的關鍵字清單。目前先讓選項預設為空的關鍵字清單。這個函式應該回傳這些陣列的笛卡兒積。

tops = [
  %{item_name: "Dress shirt"},
  %{item_name: "Casual shirt"}
]

bottoms = [
  %{item_name: "Jeans"},
  %{item_name: "Dress trousers"}
]

BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
#      {%{item_name: "Dress shirt"}, %{item_name: "Jeans"}},
#      {%{item_name: "Dress shirt"}, %{item_name: "Dress trousers"}},
#      {%{item_name: "Casual shirt"}, %{item_name: "Jeans"}},
#      {%{item_name: "Casual shirt"}, %{item_name: "Dress trousers"}}
#    ]

2. 篩選掉顏色衝突的穿搭

每件衣物都有:base_color欄位,請用這個欄位篩選掉所有上衣與下著底色相同的組合。

tops = [
  %{item_name: "Dress shirt", base_color: "blue"},
  %{item_name: "Casual shirt", base_color: "black"}
]

bottoms = [
  %{item_name: "Jeans", base_color: "blue"},
  %{item_name: "Dress trousers", base_color: "black"}
]

BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
#      {%{item_name: "Dress shirt", base_color: "blue"},
#       %{item_name: "Dress trousers", base_color: "black"}},
#      {%{item_name: "Casual shirt", base_color: "black"},
#       %{item_name: "Jeans", base_color: "blue"}}
#    ]

3. 依組合價格篩選

每件衣物都有一個相關的:price欄位。雖然你想提供大量的推薦,但你也希望讓使用者有機會選擇符合預算的價格。從選項的關鍵字清單中,使用:maximum_price來篩選掉上衣與下著價格總和超過最高價格的組合。

如果沒有指定 maximum_price,預設值應該是100.00。

tops = [
  %{item_name: "Dress shirt", base_color: "blue", price: 35},
  %{item_name: "Casual shirt", base_color: "black", price: 20}
]

bottoms = [
  %{item_name: "Jeans", base_color: "blue", price: 30},
  %{item_name: "Dress trousers", base_color: "black", price: 75}
]

BoutiqueSuggestions.get_combinations(tops, bottoms, maximum_price: 50)
# => [
#      {%{item_name: "Casual shirt", base_color: "black", price: 20},
#       %{item_name: "Jeans", base_color: "blue", price: 30}}
#    ]
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elixir Exercism

準備好開始 精品店推薦 了嗎?

註冊 Exercism,透過 58 個概念168 個練習 和真人引導來學習並精通 Elixir,全部免費。