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

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

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

مقدمه

تاپل

تاپل یک گروه تغییرناپذیر از مقادیری است که بینام اما مرتباند. تاپل میتواند هر نوع دادهای (یا چندین نوع داده) را در خود نگه دارد، از جمله تاپلهای دیگر.

تاپلها بهصورت مقادیری تعریف میشوند که با کاما از هم جدا شدهاند و بین کاراکترهای ( و ) قرار میگیرند: (<element_1>, ... , <element_n>).

("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)

فقط تاپلهایی را میتوان با هم مقایسه کرد که طول یکسان و نوعهای یکسان (با ترتیب یکسان) داشته باشند. تاپلها برابری ساختاری دارند، یعنی فقط وقتی برابرند که همهی مقدارهایشان برابر باشند.

(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true

(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false

(1, 2) = (1, "2") // Same length, different types
// compiler error

(1, 2) = (1, 2, 3) // Different length
// compiler error

سه راه برای استخراج مقدارها از یک تاپل وجود دارد:

  • توابع fst و snd
  • تجزیهی تاپل
  • تطبیق الگو
let person = ("Jordan", 170)

// Option 1: fst/snd
let name1 = fst person
let length2 = snd person

// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170

// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3

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

Azara و Rui هم‌تیمی‌هایی هستند که در یک شکار گنج با مضمون دزدان دریایی با هم رقابت می‌کنند. یکی فهرستی از گنج‌ها همراه با مختصات نقشه دارد و دیگری فهرستی از نام مکان‌ها همراه با مختصات نقشه. نقشه‌های خالی هم به آن‌ها داده شده که روی هرکدام محل شروع با عبارت «شما اینجا هستید» علامت خورده است.

فهرست Azara فهرست Rui
گنج مختصات
Amethyst Octopus 1F
Angry Monkey Figurine 5B
Antique Glass Fishnet Float 3D
Brass Spyglass 4B
Carved Wooden Elephant 8C
Crystal Crab 6A
Glass Starfish 6D
Model Ship in Large Bottle 8A
Pirate Flag 7F
Robot Parrot 1C
Scrimshaw Whale's Tooth 2A
Silver Seahorse 4E
Vintage Pirate Hat 7E
نام مکان مختصات ربع
Seaside Cottages (1, 'C') Blue
Aqua Lagoon (Island of Mystery) (1, 'F') Yellow
Deserted Docks (2, 'A') Blue
Spiky Rocks (3, 'D') Yellow
Abandoned Lighthouse (4, 'B') Blue
Hidden Spring (Island of Mystery) (4, 'E') Yellow
Stormy Breakwater (5, 'B') Purple
Old Schooner (6, 'A') Purple
Tangled Seaweed Patch (6, 'D') Orange
Quiet Inlet (Island of Mystery) (7, 'E') Orange
Windswept Hilltop (Island of Mystery) (7, 'F') Orange
Harbor Managers Office (8, 'A') Purple
Foggy Seacave (8, 'C') Purple

اما همه‌چیز کمی نامرتب است: به نظر می‌رسد مختصات‌های Azara با مختصات‌های Rui متفاوت قالب‌بندی و مرتب شده‌اند و آن‌ها باید مدام از یک فهرست به فهرست دیگر نگاه کنند تا بفهمند کدام گنج‌ها به کدام مکان‌ها مربوط‌اند. چون تازه‌کارهای F# هستند، پیش شما آمده‌اند تا برای نوشتن یک برنامه‌ی کوچک (در واقع مجموعه‌ای از توابع) که اطلاعات شکارشان را بهتر سازمان‌دهی کند، از شما کمک بخواهند.

1. استخراج مختصات

تابع getCooordinate() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) را از فهرست Azara می‌گیرد و فقط مختصات نقشه‌ی استخراج‌شده را برمی‌گرداند.

getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"

2. قالب‌بندی مختصات

تابع convertCoordinate() را پیاده‌سازی کنید که یک مختصات در قالب "2A" می‌گیرد و یک تاپل در قالب (2, 'A') برمی‌گرداند.

convertCoordinate "2A"
// (2, 'A')

3. تطبیق مختصات

تابع compareRecords() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) و یک رکورد (location, coordinate, quadrant) می‌گیرد و مختصات‌های هر دو را با هم مقایسه می‌کند. اگر مختصات‌ها «تطبیق» داشته باشند true را برگردانید و اگر نداشته باشند false را برگردانید. برای مقایسه‌ی دقیق، مختصات‌ها را در صورت نیاز دوباره قالب‌بندی کنید.

compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false

compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true

4. ترکیب رکوردهای منطبق

تابع createrecord() را پیاده‌سازی کنید که یک جفت (treasure, coordinate) را از فهرست Azara و یک رکورد (location, coordinate, quadrant) را از فهرست Rui می‌گیرد و اگر مختصات‌ها منطبق باشند (coordinate, location, quadrant, treasure) را برمی‌گرداند. اگر مختصات‌ها منطبق نباشند، یک تاپل با همان شکل ولی پرشده با "" را برمی‌گرداند. برای مقایسه‌ی دقیق، مختصات‌ها را در صورت نیاز دوباره قالب‌بندی کنید.

createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")

createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
F# Exercism

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

در Exercism ثبت‌نام کنید تا F# را همراه با 18 مفهوم148 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.