Tu es un immense fan de géocaching, qui allie ton amour du plein air à celui des énigmes. Même si le site local de géocaching liste les coordonnées GPS de toutes les caches, il ne prend pas en charge la création d'un itinéraire efficace pour les récupérer. Il se trouve que tu as un logiciel de recherche de chemin installé sur ta machine, mais celui-ci utilise un format GPS différent de celui du site de géocaching. Pour transmettre les données au logiciel de recherche de chemin, tu devras analyser les degrés et l'hémisphère, pour la latitude comme pour la longitude, de chaque coordonnée GPS figurant sur le site.
Ta tâche consiste à analyser des coordonnées GPS. Chaque coordonnée est écrite selon la variante du format degrés décimaux avec des hémisphères explicites :
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
Voici les valeurs autorisées pour chaque composant :
<LATITUDE_DEGREES> : un nombre à virgule flottante compris entre 0 et 90 (bornes incluses)<LATITUDE_HEMISPHERE> : soit N, soit S
<LONGITUDE_DEGREES> : un nombre à virgule flottante compris entre 0 et 180 (bornes incluses)<LONGITUDE_HEMISPHERE> : soit E, soit W
Par exemple, "48.8584 N, 2.2945 E" s'analyse en :
<LATITUDE_DEGREES> : 48,8584<LATITUDE_HEMISPHERE> : N<LONGITUDE_DEGREES> : 2,2945<LONGITUDE_HEMISPHERE> : ETu as 11 tâches, au cours desquelles tu vas analyser des coordonnées GPS progressivement. Tu vas utiliser la prise en charge des grammaires de clauses définies (DCG) de Prolog, qui sont conçues pour analyser du texte structuré.
Pour t'aider à démarrer, le fichier d'ébauche inclut déjà la bibliothèque dcg/basics via :
:- use_module(library(dcg/basics)).
Implémente la règle comma pour analyser une virgule seule (",") :
?- string_codes(",", Codes), phrase(comma, Codes).
Implémente la règle space pour analyser un espace seul (" ") :
?- string_codes(" ", Codes), phrase(space, Codes).
Modifie la règle space pour analyser tous les espaces blancs, sauf les sauts de ligne :
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
L'hémisphère de la latitude peut être soit "N", soit "S", qui doit être analysé en l'atome north ou south.
Implémente la règle latitude_hemisphere pour analyser l'hémisphère de la latitude :
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
L'hémisphère de la longitude peut être soit "E", soit "W", qui doit être analysé en l'atome east ou west.
Implémente la règle longitude_hemisphere pour analyser l'hémisphère de la longitude :
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
Les degrés d'une longitude ou d'une latitude sont définis comme un nombre à virgule flottante.
Implémente la règle degrees pour analyser des nombres à virgule flottante :
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Les degrés de latitude ne sont pas de simples nombres à virgule flottante, mais des nombres à virgule flottante compris entre 0 et 90 (bornes incluses).
Implémente la règle latitude_degrees pour analyser les degrés de latitude en utilisant l'intervalle ci-dessus :
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
Les degrés de longitude ne sont pas de simples nombres à virgule flottante, mais des nombres à virgule flottante compris entre 0 et 180 (bornes incluses).
Implémente la règle longitude_degrees pour analyser les degrés de longitude en utilisant l'intervalle ci-dessus :
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
Une latitude comporte deux parties : ses degrés et son hémisphère, séparés par un espace.
Implémente la règle latitude pour analyser une latitude :
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
Une latitude comporte deux parties : ses degrés et son hémisphère, séparés par un espace.
Implémente la règle latitude pour analyser une latitude :
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
Une coordonnée comporte deux parties : sa latitude et sa longitude, séparées par une virgule suivie d'un espace.
Implémente la règle coordinate pour analyser à la fois la latitude (les degrés et l'hémisphère) :
?- 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.
Inscris-toi sur Exercism pour apprendre et maîtriser Prolog avec 109 exercices, et un vrai mentorat humain, le tout gratuitement.