المسارات
/
F#
F#
/
التمارين
/
البحث عن الكنز في Tisbury
البحث عن الكنز في Tisbury

البحث عن الكنز في Tisbury

تمرين تعلّمي

مقدمة

الصفوف

الصف هو تجميع غير قابل للتغيير لقيم غير مسمّاة لكن مرتّبة. ويمكن أن تحتوي الصفوف على أي نوع بيانات (أو عدة أنواع)، بما في ذلك صفوف أخرى.

تُعرَّف الصفوف بأنها قيم مفصولة بفواصل توضع بين المحرفين ( و ): (<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

التعليمات

أزارا وروي زميلان يتنافسان في رحلة بحث عن الكنز بطابع القراصنة. لدى أحدهما قائمة كنوز مع إحداثياتها على الخريطة، ولدى الآخر قائمة أسماء أماكن مع إحداثياتها على الخريطة. وقد أُعطيت لهما أيضًا خرائط فارغة عليها علامة عند نقطة البداية مكتوب عليها «أنت هنا».

قائمة أزارا قائمة روي
الكنز الإحداثيات
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

لكن الأمور غير منظمة قليلًا: يبدو أن إحداثيات أزارا منسَّقة ومرتَّبة بطريقة مختلفة عن إحداثيات روي، وعليهما أن يظلّا يتنقلان بالنظر بين القائمتين لمعرفة أي الكنوز يقابل أي الأماكن. ولأنهما مبرمجان ناشئان بلغة F#، فقد جاءا إليك طلبًا للمساعدة في كتابة برنامج صغير (مجموعة دوال في الحقيقة) لتنظيم معلومات رحلتهما بشكل أفضل.

1. استخراج الإحداثيات

نفّذ الدالة getCooordinate() التي تأخذ زوجًا (treasure, coordinate) من قائمة أزارا وتُرجع إحداثي الخريطة المستخرج فقط.

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) من قائمة أزارا وسجلًّا (location, coordinate, quadrant) من قائمة روي وتُرجع (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

مستعد لبدء البحث عن الكنز في Tisbury؟

سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.