Tracks
/
Elixir
Elixir
/
Übungen
/
Boutique-Vorschläge
Boutique-Vorschläge

Boutique-Vorschläge

Lernübung

Einführung

List Comprehensions

Comprehensions bieten eine einfache und deklarative Möglichkeit, Enumerables umzuwandeln.

Um eine sehr einfache Comprehension zu deklarieren, verwendest du das Schlüsselwort for, gefolgt von einem Generator und einem do-Block, der aus den aufgezählten Werten die neuen Werte erzeugt.

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

Comprehensions können auch Filter haben. Werte, die den Filter nicht bestehen, werden aus der endgültigen Liste entfernt:

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

Du kannst komplexere Comprehensions auch über mehrere Zeilen deklarieren:

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

# => [:b, :d]

Ein kartesisches Produkt lässt sich mit mehreren Generatoren erzeugen. Das bedeutet, dass jeder Wert, den der erste Generator erzeugt, einmal mit jedem Wert des zweiten Generators kombiniert wird:

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

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

Anleitung

Deine Arbeit in der Online-Modeboutique geht weiter. Du hast die Idee für eine Website-Funktion, bei der dem Nutzer ein Outfit vorgeschlagen wird. Du willst zwar viele Vorschläge machen, aber keine schlechten. Deshalb entscheidest du dich für eine List Comprehension, weil du damit ganz einfach Outfit-Kombinationen erzeugen und sie anschließend nach bestimmten Kriterien filtern kannst.

Kleidungsstücke werden als Map gespeichert:

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

1. Schlage eine Kombination vor

Implementiere get_combinations/3 so, dass die Funktion eine Liste von Oberteilen, eine Liste von Unterteilen und eine Keyword-Liste mit Optionen entgegennimmt. Setze fürs Erste als Standard für die Optionen eine leere Keyword-Liste. Die Funktion soll das kartesische Produkt der Listen zurückgeben.

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. Filtere kollidierende Outfits heraus

Jedes Kleidungsstück hat ein :base_color-Feld. Nutze dieses Feld, um alle Kombinationen herauszufiltern, bei denen Oberteil und Unterteil dieselbe Grundfarbe haben.

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. Filtere nach dem Preis der Kombination

Zu jedem Kleidungsstück gehört ein :price-Feld. Du willst zwar viele Vorschläge machen, aber den Nutzern auch die Möglichkeit geben, einen Preis innerhalb ihres Budgets zu wählen. Nutze aus der Keyword-Liste mit Optionen :maximum_price, um Kombinationen herauszufiltern, bei denen der Preis von Oberteil und Unterteil den Höchstpreis überschreitet.

Wenn kein maximum_price angegeben ist, sollte der Standardwert 100.00 sein.

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}}
#    ]
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Boutique-Vorschläge zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.