المسارات
/
Prolog
Prolog
/
التمارين
/
نظام تحديد المواقع العالمي
نظام تحديد المواقع العالمي

نظام تحديد المواقع العالمي

متوسط

مقدمة

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

التعليمات

مهمتك هي تحليل إحداثيات 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، وهي مصممة لتحليل النصوص المهيكلة.

Note

لمساعدتك على البدء، يتضمن ملف البداية بالفعل مكتبة dcg/basics عبر:

:- use_module(library(dcg/basics)).

1. تحليل فاصلة

نفّذ القاعدة comma لتحليل فاصلة واحدة (","):

?- string_codes(",", Codes), phrase(comma, Codes).

2. تحليل مسافة

نفّذ القاعدة space لتحليل مسافة واحدة (" "):

?- string_codes(" ", Codes), phrase(space, Codes).

3. دعم كل المسافات البيضاء (عدا الأسطر الجديدة)

عدّل القاعدة space لتحليل كل المسافات البيضاء، عدا الأسطر الجديدة:

?- string_codes("\t", Codes), phrase(space, Codes).

?- string_codes("\n", Codes), phrase(space, Codes).
false.

4. تحليل نصف كرة خط العرض

يمكن أن يكون نصف كرة خط العرض إما "N" أو "S"، ويجب تحليله إلى الذرة north أو south. نفّذ القاعدة latitude_hemisphere لتحليل نصف كرة خط العرض:

?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.

5. تحليل نصف كرة خط الطول

يمكن أن يكون نصف كرة خط الطول إما "E" أو "W"، ويجب تحليله إلى الذرة east أو west. نفّذ القاعدة longitude_hemisphere لتحليل نصف كرة خط الطول:

?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.

6. تحليل الدرجات

تُعرَّف درجات خط الطول أو خط العرض على أنها عدد عشري. نفّذ القاعدة degrees لتحليل الأعداد العشرية:

?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.

7. تحليل درجات خط العرض

درجات خط العرض ليست مجرد أعداد عشرية، بل أعداد عشرية في النطاق 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.

8. تحليل درجات خط الطول

درجات خط الطول ليست مجرد أعداد عشرية، بل أعداد عشرية في النطاق 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.

9. تحليل خط العرض

يتكوّن خط العرض من جزأين: درجاته ونصف كرته، ويفصل بينهما مسافة. نفّذ القاعدة latitude لتحليل خط العرض:

?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.

10. تحليل خط الطول

يتكوّن خط العرض من جزأين: درجاته ونصف كرته، ويفصل بينهما مسافة. نفّذ القاعدة latitude لتحليل خط العرض:

?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.

11. تحليل الإحداثية

تتكوّن الإحداثية من جزأين: خط العرض وخط الطول، ويفصل بينهما فاصلة تليها مسافة. نفّذ القاعدة 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.
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Prolog Exercism

مستعد لبدء نظام تحديد المواقع العالمي؟

سجّل في Exercism لتتعلّم وتتقن Prolog عبر 109 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.