És um grande fã de geocaching, que combina o teu amor pela natureza com o prazer de resolver quebra-cabeças. Embora o site de geocaching local liste as coordenadas GPS de todas as caches, não permite criar uma rota eficiente para as recolher. Acontece que tens um software de procura de caminhos instalado na tua máquina, mas ele usa um formato de GPS diferente do do site de geocaching. Para introduzires os dados no software de procura de caminhos, vais ter de analisar os graus e o hemisfério, tanto da latitude como da longitude, de cada coordenada GPS que aparece no site.
A tua tarefa é analisar coordenadas de GPS. Cada coordenada é formatada usando a variante do formato de graus decimais com hemisférios explícitos:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
Estes são os valores permitidos para cada componente individual:
<LATITUDE_DEGREES>: um número de vírgula flutuante no intervalo 0..90 (inclusive)<LATITUDE_HEMISPHERE>: N ou S
<LONGITUDE_DEGREES>: um número de vírgula flutuante no intervalo 0..180 (inclusive)<LONGITUDE_HEMISPHERE>: E ou W
Por exemplo, "48.8584 N, 2.2945 E" é analisado como:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: ETens 11 tarefas, nas quais vais analisar coordenadas de GPS de forma incremental. Vais usar o suporte do Prolog para Gramáticas de Cláusulas Definidas (DCG), que são concebidas para analisar texto estruturado.
Para te ajudar a começar, o ficheiro stub já inclui a biblioteca dcg/basics através de:
:- use_module(library(dcg/basics)).
Implementa a regra comma para analisar uma única vírgula (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Implementa a regra space para analisar um único espaço (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Modifica a regra space para analisar todos os espaços em branco, exceto novas linhas:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
O hemisfério da latitude pode ser "N" ou "S", que devem ser analisados para o átomo north ou south.
Implementa a regra latitude_hemisphere para analisar o hemisfério da latitude:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
O hemisfério da longitude pode ser "E" ou "W", que devem ser analisados para o átomo east ou west.
Implementa a regra longitude_hemisphere para analisar o hemisfério da longitude:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
Os graus de uma longitude ou latitude são definidos como um número de vírgula flutuante.
Implementa a regra degrees para analisar números de vírgula flutuante:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Os graus de latitude não são apenas números de vírgula flutuante: são números de vírgula flutuante no intervalo 0..90 (inclusive).
Implementa a regra latitude_degrees para analisar graus de latitude usando o intervalo acima:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
Os graus de longitude não são apenas números de vírgula flutuante: são números de vírgula flutuante no intervalo 0..180 (inclusive).
Implementa a regra longitude_degrees para analisar graus de longitude usando o intervalo acima:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
As latitudes têm duas partes: os graus e o hemisfério, que são separados por um espaço.
Implementa a regra latitude para analisar uma latitude:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
As latitudes têm duas partes: os graus e o hemisfério, que são separados por um espaço.
Implementa a regra latitude para analisar uma latitude:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
As coordenadas têm duas partes: a latitude e a longitude, que são separadas por uma vírgula seguida de um espaço.
Implementa a regra coordinate para analisar tanto a latitude (graus e hemisfério):
?- 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.
Inscreve-te no Exercism para aprenderes e dominares Prolog com 109 exercícios, e mentoria humana real, tudo grátis.