مسیرها
/
Elm
Elm
/
تمرین‌ها
/
همه را باید قاپید!
همه را باید قاپید!

همه را باید قاپید!

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

مقدمه

Set

Set a دنباله‌ای از مقادیر یکتا از نوع a است. مقادیر باید از نوع comparable باشند (Int، Float، Time، Char، String و تاپل‌ها یا لیست‌هایی از انواع قابل مقایسه).

می‌توانید لیست‌ها و مجموعه‌ها را با Set.toList و Set.fromList به یکدیگر تبدیل کنید. به دلیل ساختار داخلی Set، تضمین می‌شود که لیستی که از Set.fromList به‌دست می‌آید مرتب باشد.

Set.fromList [2, 3, 3, 3, 1, 1, 2]
    --> Set.fromList [1, 2, 3]

Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
    --> [1, 2, 3]

می‌توانید با Set.empty، Set.singleton، Set.insert و Set.remove مجموعه بسازید و آن را پر کنید.

Set.empty
    --> Set.fromList []

Set.singleton "hi"
    --> Set.fromList ["hi"]

eightyEight = Set.singleton 88

Set.insert 88 eightyEight
    --> Set.fromList [88]

Set.insert 89 eightyEight
    --> Set.fromList [88, 89]

Set.remove 88 eightyEight
    --> Set.fromList []

Set.remove 89 eightyEight
    --> Set.fromList [88]

می‌توانید محتویات یک مجموعه را با توابع Set.member، Set.isEmpty و Set.size بررسی کنید.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

مجموعه‌ها را می‌توان با Set.union، Set.intersect و Set.diff ترکیب کرد.

a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Set.union a b
    --> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

Set.intersect a b
    --> Set.fromList [1, 10]

Set.diff a b
    --> Set.fromList [100]

Set.diff b a
    --> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]

می‌توانید مجموعه‌ها را فیلتر و بخش‌بندی کنید.

even n = modBy 2 n == 0

Set.filter even b
    --> Set.fromList [2, 4, 6, 8, 10]

Set.partition even b
    --> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])

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

نوستالژی شما برای کارت‌های Blorkemon™️ هیچ نشانه‌ای از فروکش کردن ندارد؛ حتی دوباره جمع‌آوری‌شان را شروع کرده‌اید و دارید دوستانتان را هم با خود همراه می‌کنید.

در این تمرین، یک مجموعه‌ی Card با Set Card نمایش داده می‌شود، چون وقتی هدف‌تان به دست آوردن همه‌ی کارت‌های موجود است، کارت‌های تکراری اهمیتی ندارند.

1. شروع یک مجموعه

شما واقعاً می‌خواهید دوستانتان هم به دیوانگی Blorkemon™️ شما بپیوندند، و بهترین راه این است که با دادن یک کارت، مجموعه‌ی آن‌ها را راه بیندازید.

تابع newCollection را پیاده‌سازی کنید که یک کارت را به یک مجموعه تبدیل می‌کند.

newCollection "Newthree"
    --> Set.fromList ["Newthree"]

2. رشد دادن مجموعه

وقتی مجموعه‌ای دارید، به زندگی خودش ادامه می‌دهد و باید رشد کند.

تابع addCard را پیاده‌سازی کنید که یک Card و یک مجموعه می‌گیرد و یک Tuple با دو مقدار برمی‌گرداند: یک Bool که نشان می‌دهد آیا آن Card از قبل در مجموعه بوده است، و مجموعه‌ای که کارت به آن اضافه شده است.

addCard "Scientuna" (Set.fromList ["Newthree"])
    --> (False, Set.fromList ["Newthree", "Scientuna"])

3. شروع معامله

حالا که دوستانتان دوباره دیوانه‌ی Blorkemon™️ شده‌اند، می‌توانید از این موقعیت برای بزرگ کردن مجموعه‌ی خودتان با معامله‌ی کارت‌ها استفاده کنید.

هر معامله‌ای ارزش انجام دادن ندارد، یا اصلاً نمی‌تواند انجام شود. کارتی را که ندارید نمی‌توانید معامله کنید، و نباید کارتی را با کارتی که از قبل دارید معامله کنید.

تابع tradeCard را پیاده‌سازی کنید که دو کارت برای معامله (مال شما و مال آن‌ها) و مجموعه‌ی کنونی‌تان را می‌گیرد. مقدار بازگشتی یک Tuple از دو مقدار است: یک Bool که مشخص می‌کند آیا معامله ممکن و به‌صرفه است، و مجموعه‌ای که در صورت انجام معامله به آن می‌رسید (حتی اگر واقعاً ممکن نباشد).

tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
    --> (True, Set.fromList ["Newthree"])

4. از هر کارت فقط یکی

در یک بازار مکاره، انباری قدیمی از کارت پیدا می‌کنید. باید کارت‌ها را مرتب کنید و کارت‌های تکراری را حذف کنید تا فهرست را با مجموعه‌ی خودتان مقایسه کنید.

تابع removeDuplicates را پیاده‌سازی کنید که فهرستی از کارت‌ها را مرتب می‌کند و فهرستی از کارت‌های مرتب و یکتا برمی‌گرداند.

removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
    --> ["Newthree", "Scientuna"]

5. کارت‌هایی که آن‌ها ندارند

وقت آن رسیده که به مجموعه‌تان افتخار کنید.

تابع extraCards را پیاده‌سازی کنید که مجموعه‌ی شما و مجموعه‌ی دیگری را می‌گیرد و تعداد کارت‌هایی را برمی‌گرداند که مجموعه‌ی دیگر ندارد.

extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
    --> 0

6. کارت‌هایی که همه‌شان دارند

شما و دوستان علاقه‌مندتان به Blorkemon™️ جمع می‌شوید و از خودتان می‌پرسید کدام کارت‌ها رایج‌ترین‌اند.

تابع boringCards را پیاده‌سازی کنید که فهرستی از مجموعه‌ها را می‌گیرد و فهرستی از کارت‌های مرتبی را برمی‌گرداند که همه‌ی مجموعه‌ها دارند.

boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> ["Scientuna"]

7. همه‌ی کارت‌ها

آیا شما و دوستانتان روی هم همه‌ی کارت‌های Blorkemon™️ را دارید؟

تابع totalCards را پیاده‌سازی کنید که فهرستی از مجموعه‌ها را می‌گیرد و تعداد کل کارت‌های متفاوت در همه‌ی مجموعه‌ها را برمی‌گرداند.

totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> 2

8. بردن با کارت‌های براق

برادرزاده‌تان به‌زودی به دیدارتان می‌آید و دلتان می‌خواهد او را تحت تأثیر قرار دهید. بچه‌ها چیزهای براق را دوست دارند، نه؟ کارت‌های Blorkemon™️ می‌توانند براق باشند!

تابع splitShinyCards را پیاده‌سازی کنید که یک مجموعه می‌گیرد و یک Tuple با دو فهرست از کارت‌های مرتب برمی‌گرداند: یکی با همه‌ی کارت‌هایی که با "Shiny" شروع می‌شوند و یکی با بقیه‌ی کارت‌ها.

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elm Exercism

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

در Exercism ثبت‌نام کنید تا Elm را همراه با 28 مفهوم110 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.