Eres un gran fan del geocaching, que combina tu amor por la naturaleza con tu amor por resolver acertijos. Si bien el sitio web local de geocaching incluye las coordenadas GPS de todos los escondites, no admite la creación de una ruta eficiente para recogerlos. Resulta que tienes un software de búsqueda de rutas instalado en tu computadora, pero usa un formato GPS diferente al del sitio web de geocaching. Para introducir los datos en el software de búsqueda de rutas, tendrás que parsear los grados y el hemisferio tanto de la latitud como de la longitud de cada coordenada GPS del sitio web.
Tu tarea es analizar coordenadas GPS. Cada coordenada está formateada usando la variante del formato de grados decimales con hemisferios explícitos:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
Estos son los valores permitidos para cada componente individual:
<LATITUDE_DEGREES>: un número de punto flotante en el rango 0..90 (inclusive)<LATITUDE_HEMISPHERE>: ya sea N o S
<LONGITUDE_DEGREES>: un número de punto flotante en el rango 0..180 (inclusive)<LONGITUDE_HEMISPHERE>: ya sea E o W
Por ejemplo, "48.8584 N, 2.2945 E" se analiza como:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: ETienes 11 tareas, en las que irás analizando coordenadas GPS de forma incremental. Usarás el soporte de gramática de cláusulas definidas (DCG) de Prolog, que están diseñadas para analizar texto estructurado.
Para ayudarte a empezar, el archivo stub ya incluye la biblioteca dcg/basics mediante:
:- use_module(library(dcg/basics)).
Implementa la regla comma para analizar una sola coma (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Implementa la regla space para analizar un solo espacio (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Modifica la regla space para analizar todos los espacios en blanco, excepto los saltos de línea:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
El hemisferio de la latitud puede ser "N" o "S", que deben analizarse como el átomo north o south.
Implementa la regla latitude_hemisphere para analizar el hemisferio de la latitud:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
El hemisferio de la longitud puede ser "E" o "W", que deben analizarse como el átomo east o west.
Implementa la regla longitude_hemisphere para analizar el hemisferio de la longitud:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
Los grados de una longitud o una latitud se definen como un número de punto flotante.
Implementa la regla degrees para analizar números de punto flotante:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Los grados de latitud no son solo números de punto flotante, sino números de punto flotante en el rango 0..90 (inclusive).
Implementa la regla latitude_degrees para analizar los grados de latitud usando el rango anterior:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
Los grados de longitud no son solo números de punto flotante, sino números de punto flotante en el rango 0..180 (inclusive).
Implementa la regla longitude_degrees para analizar los grados de longitud usando el rango anterior:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
Las latitudes tienen dos partes: sus grados y su hemisferio, que están separados por un espacio.
Implementa la regla latitude para analizar una latitud:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
Las latitudes tienen dos partes: sus grados y su hemisferio, que están separados por un espacio.
Implementa la regla latitude para analizar una latitud:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
Las coordenadas tienen dos partes: su latitud y su longitud, que están separadas por una coma seguida de un espacio.
Implementa la regla coordinate para analizar tanto la latitud (grados y hemisferio):
?- 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.
Regístrate en Exercism para aprender y dominar Prolog con 109 ejercicios y mentoría humana real, todo gratis.