Track
/
Elixir
Elixir
/
Esercizi
/
Suggerimenti della boutique
Suggerimenti della boutique

Suggerimenti della boutique

Esercizio di apprendimento

Introduzione

Comprensioni di liste

Le comprensioni permettono di trasformare gli Enumerables in modo semplice e dichiarativo.

Per dichiarare una comprensione molto semplice, possiamo usare la parola chiave for, seguita da un generatore e da un blocco do che crea i nuovi valori a partire dai valori enumerati.

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

Le comprensioni possono anche avere dei filtri. I valori che non superano il filtro vengono rimossi dalla lista finale:

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

Possiamo dichiarare comprensioni più complesse su più righe:

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

# => [:b, :d]

Si può creare un prodotto cartesiano usando più generatori. Questo significa che ogni valore generato dal primo generatore verrà abbinato una volta a ciascun valore generato dal secondo generatore:

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

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

Istruzioni

Il tuo lavoro presso il negozio online di moda continua. Ti viene l'idea per una funzionalità del sito che suggerisca un outfit all'utente. Vuoi dare tanti suggerimenti, ma non vuoi darne di sbagliati, così decidi di usare una list comprehension: puoi generare facilmente combinazioni di outfit e poi filtrarle in base a qualche criterio.

I capi di abbigliamento sono memorizzati in una mappa:

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

1. Suggerisci una combinazione

Implementa get_combinations/3 in modo che prenda una lista di top, una lista di bottom e una keyword list di opzioni. Per ora, imposta le opzioni su una keyword list vuota come valore predefinito. La funzione dovrebbe restituire il prodotto cartesiano delle liste.

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. Filtra gli outfit che non si abbinano

Ogni capo di abbigliamento ha un campo :base_color: usa questo campo per filtrare tutte le combinazioni in cui il top e il bottom hanno lo stesso colore di base.

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. Filtra in base al prezzo della combinazione

Ogni capo di abbigliamento ha un campo :price associato. Vuoi dare tanti suggerimenti, ma vuoi anche poter offrire agli utenti la possibilità di scegliere un prezzo entro il proprio budget. Dalla keyword list di opzioni, usa :maximum_price per filtrare le combinazioni in cui il prezzo del top e del bottom supera il prezzo massimo.

Se non viene specificato maximum_price, il valore predefinito dovrebbe essere 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}}
#    ]
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Suggerimenti della boutique?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.