مسیرها
/
Elixir
Elixir
/
تمرین‌ها
/
انبار شراب
انبار شراب

انبار شراب

تمرین یادگیری

مقدمه

لیست کلیدواژه

«لیست کلیدواژه» یک ساختار داده‌ی کلید-مقدار است.

[month: "April", year: 2018]

لیست کلیدواژه، لیستی از تاپل‌های {key, value} است و می‌توان آن را به همین شکل هم نوشت، اما نگارش کوتاه‌تر آن رایج‌تر است.

[month: "April"] == [{:month, "April"}]
# => true

کلیدهای یک لیست کلیدواژه باید اتم باشند، اما برای مقدارها هیچ محدودیتی وجود ندارد. هر کلید را می‌توان بیش از یک بار به کار برد. جفت‌های کلید-مقدار در یک لیست کلیدواژه ترتیب مشخصی دارند.

می‌توانید با لیست کلیدواژه هم درست مثل لیست‌ها کار کنید، یا از ماژول Keyword استفاده کنید.

دستورالعمل‌ها

شما مدیر یک رستوران شیک هستید که انبار شراب بزرگی دارد. بسیاری از مشتریان شما از علاقه‌مندان سخت‌پسند شراب هستند. پیدا کردن بطری مناسب شراب برای یک مشتری خاص کار آسانی نیست.

به عنوان صاحب رستورانی که با فناوری آشناست، تصمیم گرفتید فرایند انتخاب شراب را با نوشتن اپلیکیشنی سرعت ببخشید که به مهمانان اجازه می‌دهد شراب‌های شما را بر اساس ترجیحاتشان فیلتر کنند.

1. رنگ‌های شراب را توضیح دهید

در صفحه‌ی خوش‌آمد اپلیکیشن خود می‌خواهید توضیح کوتاهی از هر رنگ شراب نمایش دهید.

تابع WineCellar.explain_colors/0 را پیاده‌سازی کنید. این تابع هیچ آرگومانی نمی‌گیرد و یک «لیست کلیدواژه‌ای» برمی‌گرداند که در آن رنگ‌های شراب کلید و توضیحات مقدار هستند.

رنگ توضیح
:white Fermented without skin contact.
:red Fermented with skin contact using dark-colored grapes.
:rose Fermented with some skin contact, but not enough to qualify as a red wine.

2. همه‌ی شراب‌های یک رنگ مشخص را به دست آورید

یک بطری شراب به صورت یک «تاپل» ۳تایی از گونه‌ی انگور، سال، و کشور مبدأ نمایش داده می‌شود. شراب‌ها بر اساس رنگ شراب در یک لیست کلیدواژه‌ای ذخیره می‌شوند.

[
  white: {"Chardonnay", 2015, "Italy"},
  white: {"Pinot grigio", 2017, "Germany"},
  red: {"Pinot noir", 2016, "France"},
  rose: {"Dornfelder", 2018, "Germany"}
]

تابع WineCellar.filter/3 را پیاده‌سازی کنید. این تابع باید یک لیست کلیدواژه‌ای از شراب‌ها، یک «اتم» رنگ و یک لیست کلیدواژه‌ای از گزینه‌ها با مقدار پیش‌فرض [] بگیرد. تابع باید فهرستی از شراب‌های یک رنگ مشخص را برگرداند.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white
)

# => [
#      {"Chardonnay", 2015, "Italy"},
#      {"Pinot grigio", 2017, "Germany"}
#    ]

3. همه‌ی شراب‌های یک رنگ مشخص را که در یک سال مشخص بطری شده‌اند به دست آورید

تابع WineCellar.filter/3 را گسترش دهید. وقتی گزینه‌ی :year داده شود، تابع باید فهرستی از شراب‌های یک رنگ مشخص از یک سال مشخص را برگرداند.

از تابع WineCellar.filter_by_year/2 که پیش‌تر پیاده‌سازی شده است استفاده کنید. این تابع یک فهرست از شراب‌ها و یک سال را به عنوان آرگومان می‌گیرد و فهرستی از شراب‌های یک سال مشخص را برمی‌گرداند.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015
)

# => [
#      {"Chardonnay", 2015, "Italy"}
#    ]

4. همه‌ی شراب‌های یک رنگ مشخص را که در یک کشور مشخص بطری شده‌اند به دست آورید

تابع WineCellar.filter/3 را گسترش دهید. وقتی گزینه‌ی :country داده شود، تابع باید فهرستی از شراب‌های یک رنگ مشخص از یک کشور مشخص را برگرداند.

از تابع WineCellar.filter_by_country/2 که پیش‌تر پیاده‌سازی شده است استفاده کنید. این تابع یک فهرست از شراب‌ها و یک کشور را به عنوان آرگومان می‌گیرد و فهرستی از شراب‌های یک کشور مشخص را برمی‌گرداند.

مطمئن شوید که تابع وقتی هر دو گزینه‌ی :year و :country داده می‌شوند، به هر ترتیبی که باشند، درست کار می‌کند.

WineCellar.filter(
  [
    white: {"Chardonnay", 2015, "Italy"},
    white: {"Pinot grigio", 2017, "Germany"},
    red: {"Pinot noir", 2016, "France"},
    rose: {"Dornfelder", 2018, "Germany"}
  ],
  :white,
  year: 2015,
  country: "Germany"
)

# => []
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید انبار شراب را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.