Треки
/
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}]

Вказівки

Ми продовжуємо працювати в інтернет-магазині модного одягу. У нас виникає ідея нової можливості на сайті, де користувачеві пропонується готовий образ. Ми хочемо давати багато пропозицій, але не хочемо давати поганих, тож вирішуємо скористатися list comprehension, адже так можна легко генерувати комбінації образів, а потім фільтрувати їх за певними критеріями.

Предмети одягу зберігаються у вигляді мапи:

%{
  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, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.