Треки
/
Prolog
Prolog
/
Вправи
/
Глобальна система позиціонування
Глобальна система позиціонування

Глобальна система позиціонування

Середня

Вступ

Ми великі шанувальники геокешингу, який поєднує нашу любов до природи з любовʼю до розвʼязування головоломок. Хоча місцевий сайт геокешингу перелічує GPS-координати всіх схованок, він не підтримує створення ефективного маршруту для їхнього збирання. Так сталося, що на нашому компʼютері встановлено програмне забезпечення для пошуку шляхів, але воно використовує інший формат GPS, ніж сайт геокешингу. Щоб передати дані в програму для пошуку шляхів, нам потрібно розібрати градуси і півкулю для широти і довготи кожної GPS-координати на сайті.

Вказівки

Мета цієї вправи - розібрати координати 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. Ми будемо використовувати підтримку Definite Clause Grammar (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. Розібрати довготу

Довгота складається з двох частин: градусів і півкулі, розділених пробілом. Реалізуйте правило longitude, яке розбирає довготу:

?- 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 вправ та справжнє наставництво від людей, і все це безкоштовно.