أنت شغوف جدًا بـالجيوكاشينغ، وهو نشاط يجمع بين حبك للهواء الطلق وحبك لحل الألغاز. وبينما يعرض موقع الجيوكاشينغ المحلي إحداثيات نظام تحديد المواقع العالمي لجميع المخابئ، فإنه لا يدعم إنشاء مسار فعّال لجمعها. ويصادف أن لديك برنامج لتخطيط المسارات مثبت على جهازك، لكنه يستخدم تنسيقًا لنظام تحديد المواقع العالمي يختلف عن تنسيق موقع الجيوكاشينغ. لتغذية البيانات إلى برنامج تخطيط المسارات، ستحتاج إلى تحليل الدرجات ونصف الكرة لكل من خط العرض وخط الطول لكل إحداثي من إحداثيات نظام تحديد المواقع العالمي على الموقع.
مهمتك هي تحليل إحداثيات GPS. تُنسّق كل إحداثية باستخدام صيغة الدرجات العشرية مع تحديد نصفي الكرة صراحةً:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
هذه هي القيم المسموح بها لكل مكوّن على حدة:
<LATITUDE_DEGREES>: عدد عشري في النطاق 0..90 (شاملًا)<LATITUDE_HEMISPHERE>: إما N أو S
<LONGITUDE_DEGREES>: عدد عشري في النطاق 0..180 (شاملًا)<LONGITUDE_HEMISPHERE>: إما E أو W
على سبيل المثال، "48.8584 N, 2.2945 E" يُحلَّل إلى:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: Eلديك 11 مهمة، ستُحلّل فيها إحداثيات GPS تدريجيًا. ستستخدم دعم قواعد العبارات المحددة (DCG) في Prolog، وهي مصممة لتحليل النصوص المهيكلة.
لمساعدتك على البدء، يتضمن ملف البداية بالفعل مكتبة dcg/basics عبر:
:- use_module(library(dcg/basics)).
نفّذ القاعدة comma لتحليل فاصلة واحدة (","):
?- string_codes(",", Codes), phrase(comma, Codes).
نفّذ القاعدة space لتحليل مسافة واحدة (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
عدّل القاعدة space لتحليل كل المسافات البيضاء، عدا الأسطر الجديدة:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
يمكن أن يكون نصف كرة خط العرض إما "N" أو "S"، ويجب تحليله إلى الذرة north أو south.
نفّذ القاعدة latitude_hemisphere لتحليل نصف كرة خط العرض:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
يمكن أن يكون نصف كرة خط الطول إما "E" أو "W"، ويجب تحليله إلى الذرة east أو west.
نفّذ القاعدة longitude_hemisphere لتحليل نصف كرة خط الطول:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
تُعرَّف درجات خط الطول أو خط العرض على أنها عدد عشري.
نفّذ القاعدة degrees لتحليل الأعداد العشرية:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
درجات خط العرض ليست مجرد أعداد عشرية، بل أعداد عشرية في النطاق 0..90 (شاملًا).
نفّذ القاعدة latitude_degrees لتحليل درجات خط العرض باستخدام النطاق أعلاه:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
درجات خط الطول ليست مجرد أعداد عشرية، بل أعداد عشرية في النطاق 0..180 (شاملًا).
نفّذ القاعدة longitude_degrees لتحليل درجات خط الطول باستخدام النطاق أعلاه:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
يتكوّن خط العرض من جزأين: درجاته ونصف كرته، ويفصل بينهما مسافة.
نفّذ القاعدة latitude لتحليل خط العرض:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
يتكوّن خط العرض من جزأين: درجاته ونصف كرته، ويفصل بينهما مسافة.
نفّذ القاعدة latitude لتحليل خط العرض:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
تتكوّن الإحداثية من جزأين: خط العرض وخط الطول، ويفصل بينهما فاصلة تليها مسافة.
نفّذ القاعدة coordinate لتحليل كلٍّ من خط العرض (الدرجات ونصف الكرة):
?- string_codes("48.8584 N, 2.2945 E", Codes), phrase(coordinate(Latitude, LatitudeHemisphere, Longitude, LongitudeHemisphere), Codes).
Latitude = 48.8584,
LatitudeHemisphere = north,
Longitude = 2.2945,
LongitudeHemisphere = east.
سجّل في Exercism لتتعلّم وتتقن Prolog عبر 109 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.