المسارات
/
Elixir
Elixir
/
التمارين
/
اقتراحات المتجر
اقتراحات المتجر

اقتراحات المتجر

تمرين تعلّمي

مقدمة

صيغ استيعاب القوائم

توفّر صيغ الاستيعاب وسيلة لتحويل Enumerables بسهولة وبأسلوب تصريحي.

لتعريف استيعاب بسيط جدًا، يمكننا استخدام الكلمة المفتاحية 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 لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.