Sei un grande appassionato di geocaching, che unisce la tua passione per l'aria aperta a quella per risolvere enigmi. Il sito locale di geocaching elenca le coordinate GPS di tutte le cache, ma non supporta la creazione di un percorso efficiente per raccoglierle. Guarda caso, sul tuo computer è già installato un software di pathfinding, che però usa un formato GPS diverso da quello del sito di geocaching. Per inserire i dati nel software di pathfinding, dovrai analizzare i gradi e l'emisfero sia della latitudine che della longitudine di ogni coordinata GPS presente sul sito.
Il tuo compito è analizzare le coordinate GPS. Ogni coordinata è formattata usando la variante con emisferi espliciti del formato gradi decimali:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
Questi sono i valori ammessi per ogni singolo componente:
<LATITUDE_DEGREES>: un numero in virgola mobile nell'intervallo 0..90 (estremi inclusi)<LATITUDE_HEMISPHERE>: N oppure S
<LONGITUDE_DEGREES>: un numero in virgola mobile nell'intervallo 0..180 (estremi inclusi)<LONGITUDE_HEMISPHERE>: E oppure W
Ad esempio, "48.8584 N, 2.2945 E" viene analizzata in:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: ECi sono 11 attività, nelle quali analizzerai le coordinate GPS in modo incrementale. Userai il supporto Definite Clause Grammar (DCG) di Prolog, progettato per analizzare testo strutturato.
Per iniziare, il file stub include già la libreria dcg/basics tramite:
:- use_module(library(dcg/basics)).
Implementa la regola comma per analizzare una singola virgola (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Implementa la regola space per analizzare un singolo spazio (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Modifica la regola space per analizzare tutti gli spazi bianchi, tranne le nuove righe:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
L'emisfero della latitudine può essere "N" oppure "S", e va analizzato nell'atomo north o south.
Implementa la regola latitude_hemisphere per analizzare l'emisfero della latitudine:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
L'emisfero della longitudine può essere "E" oppure "W", e va analizzato nell'atomo east o west.
Implementa la regola longitude_hemisphere per analizzare l'emisfero della longitudine:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
I gradi di una longitudine o di una latitudine sono definiti come un numero in virgola mobile.
Implementa la regola degrees per analizzare i numeri in virgola mobile:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
I gradi della latitudine non sono semplicemente numeri in virgola mobile, ma numeri in virgola mobile nell'intervallo 0..90 (estremi inclusi).
Implementa la regola latitude_degrees per analizzare i gradi della latitudine usando l'intervallo qui sopra:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
I gradi della longitudine non sono semplicemente numeri in virgola mobile, ma numeri in virgola mobile nell'intervallo 0..180 (estremi inclusi).
Implementa la regola longitude_degrees per analizzare i gradi della longitudine usando l'intervallo qui sopra:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
Le latitudini hanno due parti: i loro gradi e l'emisfero, separati da uno spazio.
Implementa la regola latitude per analizzare una latitudine:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
Le latitudini hanno due parti: i loro gradi e l'emisfero, separati da uno spazio.
Implementa la regola latitude per analizzare una latitudine:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
Le coordinate hanno due parti: la loro latitudine e longitudine, separate da una virgola seguita da uno spazio.
Implementa la regola coordinate per analizzare sia la latitudine (gradi ed emisfero):
?- 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.
Iscriviti a Exercism per imparare e padroneggiare Prolog con 109 esercizi e il mentoring di persone reali, tutto gratis.