مسیرها
/
Elm
Elm
/
تمرین‌ها
/
شکار گنج تیسبری
شکار گنج تیسبری

شکار گنج تیسبری

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

مقدمه

تاپل

تاپل‌ها در Elm می‌توانند دو یا سه مقدار را در خود نگه دارند و هر مقدار می‌تواند هر نوعی داشته باشد. در Elm، تاپل‌ها بیشتر برای انواع گذرای ساده به کار می‌روند. به همین دلیل تاپل‌ها حداکثر ۳ مقدار را نگه می‌دارند و برای تشویق بیشتر، توابع کمکی فقط برای ۲ مقدار ارائه شده‌اند. برای داده‌های پیچیده‌تر، بهتر است به رکوردها روی بیاورید.

type alias IntStringTuple = (Int, String)

aTuple : IntStringTuple
aTuple = (123, "elements can be of differing types")

anotherTuple : (String, String)
anotherTuple = Tuple.pair "this time it's" "two strings"
    --> ("this time it's", "two strings")

Tuple.first aTuple
    --> 123

Tuple.second aTuple
    --> "elements can be of differing types"

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

repeatString : (Int, String) -> Bool
repeatString aTuple =
let
    (aNumber, aString) = aTuple
in
    String.repeat aNumber aString

repeatStringAgain : (Int, String) -> Bool
repeatStringAgain (aNumber, aString) = String.repeat aNumber aString

has123 : (Int, String, Bool) -> Bool
has123 aTuple =
    case aTuple of
        (123, _, _) ->
            True
        (_, "123", _) ->
            True
        (_, _, True) ->
            True
        _ ->
            False

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

آزرا و روی در حال طراحی یک شکار گنج با حال‌وهوای دزدان دریایی هستند. یک فهرست از گنج‌ها همراه با موقعیتشان روی نقشه وجود دارد و فهرست دیگری از نام مکان‌ها همراه با موقعیتشان روی نقشه.

Treasure Location
Amethyst Octopus (1, F)
Angry Monkey Figurine (5, B)
Antique Glass Fishnet Float (3, D)
Brass Spyglass (4, B)
Carved Wooden Elephant (8, C)
Crystal Crab (6, A)
Glass Starfish (6, D)
Model Ship in Large Bottle (8, A)
Pirate Flag (7, F)
Robot Parrot (1, C)
Scrimshaw Whale's Tooth (1, F)
Silver Seahorse (4, E)
Vintage Pirate Hat (7, E)
Place Name Location Quadrant
Seaside Cottages (C, 1) Blue
Aqua Lagoon (Island of Mystery) (F, 1) Yellow
Deserted Docks (A, 2) Blue
Spiky Rocks (D, 3) Yellow
Abandoned Lighthouse (B, 4) Blue
Hidden Spring (Island of Mystery) (E, 4) Yellow
Stormy Breakwater (B, 5) Purple
Old Schooner (A, 6) Purple
Tangled Seaweed Patch (D, 6) Orange
Quiet Inlet (Island of Mystery) (E, 7) Orange
Windswept Hilltop (Island of Mystery) (F, 7) Orange
Harbor Managers Office (A, 8) Purple
Foggy Seacave (C, 8) Purple

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

1. تبدیل موقعیت‌ها

تابع placeLocationToTreasureLocation را پیاده‌سازی کنید. این تابع یک موقعیت مکان (مانند ('C', 1)) می‌گیرد و آن را به یک موقعیت گنج (مانند (1, 'C')) تبدیل می‌کند.

placeLocationToTreasureLocation ('C', 1)
--> (1,'C')

2. مقایسه‌ی موقعیت گنج و موقعیت مکان

تابع treasureLocationMatchesPlaceLocation را پیاده‌سازی کنید. این تابع یک PlaceLocation (مانند ('C', 1)) می‌گیرد و اگر با یک TreasureLocation (مانند (1, 'C')) مطابقت داشته باشد، «درست» را برمی‌گرداند.

treasureLocationMatchesPlaceLocation ('C', 1) (1, 'C')
--> true

treasureLocationMatchesPlaceLocation ('C', 1) (2, 'C')
--> false

3. شمارش موقعیت‌های گنج

تابع countPlaceTreasures را پیاده‌سازی کنید. این تابع یک مکان (مانند ("Aqua Lagoon (Island of Mystery)", ('F', 1))) و فهرست گنج‌ها را می‌گیرد و تعداد گنج‌هایی را برمی‌گرداند که در آن مکان پیدا می‌شوند.

place = ("Aqua Lagoon (Island of Mystery)", ('F', 1))

countPlaceTreasures place treasures =
--> 2

4. مکان‌های ویژه

تابع specialCaseSwapPossible را پیاده‌سازی کنید. این تابع یک گنج (مانند ("Amethyst Octopus", (1, 'F'))) و یک مکان (مانند ("Seaside Cottages ", ('C', 1))) می‌گیرد و برای ترکیب‌های زیر «درست» را برمی‌گرداند:

  • می‌توان Brass Spyglass را در Abandoned Lighthouse با هر گنج دیگری عوض کرد
  • می‌توان Amethyst Octopus را در Stormy Breakwater با Crystal Crab یا Glass Starfish عوض کرد
  • می‌توان Vintage Pirate Hat را در Harbor Managers Office با Model Ship in Large Bottle یا Antique Glass Fishnet Float عوض کرد

سعی کنید این تابع را به‌جای دستورهای if، به‌صورت یک دستور case با یک تاپل موردی پیاده‌سازی کنید (این یکی از الگوهای رایج در Elm است).

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elm Exercism

آماده‌اید شکار گنج تیسبری را شروع کنید؟

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