Eres un gran fan del geocaching, que combina tu amor por la naturaleza con tu pasión por resolver puzles. Aunque la web de geocaching de tu zona incluye las coordenadas GPS de todas las cachés, no admite crear una ruta eficiente para recogerlas. Resulta que tienes instalado en tu ordenador un software de búsqueda de rutas, pero usa un formato GPS distinto al de la web de geocaching. Para introducir los datos en el software de búsqueda de rutas, tendrás que analizar los grados y el hemisferio tanto de la latitud como de la longitud de cada coordenada GPS de la web.
Tu tarea es parsear 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 coma flotante en el rango 0..90 (ambos inclusive)<LATITUDE_HEMISPHERE>: ya sea N o S
<LONGITUDE_DEGREES>: un número de coma flotante en el rango 0..180 (ambos inclusive)<LONGITUDE_HEMISPHERE>: ya sea E o W
Por ejemplo, "48.8584 N, 2.2945 E" se parsea como:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: ETienes 11 tareas en las que irás parseando coordenadas GPS de forma incremental. Usarás el soporte de Gramáticas de Cláusulas Definidas (DCG) de Prolog, que están diseñadas para parsear 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 parsear una sola coma (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Implementa la regla space para parsear un solo espacio (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Modifica la regla space para parsear 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", y debe parsearse al átomo north o south.
Implementa la regla latitude_hemisphere para parsear 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", y debe parsearse al átomo east o west.
Implementa la regla longitude_hemisphere para parsear el hemisferio de la longitud:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
Los grados de una longitud o de una latitud se definen como un número de coma flotante.
Implementa la regla degrees para parsear números de coma flotante:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Los grados de la latitud no son solo números de coma flotante, sino números de coma flotante en el rango 0..90 (ambos inclusive).
Implementa la regla latitude_degrees para parsear los grados de la 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 la longitud no son solo números de coma flotante, sino números de coma flotante en el rango 0..180 (ambos inclusive).
Implementa la regla longitude_degrees para parsear los grados de la 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 parsear 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 parsear 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 parsear 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.