Você é um grande fã de geocaching, que combina seu amor pela natureza com o amor por resolver quebra-cabeças. O site local de geocaching lista as coordenadas de GPS de todos os caches, mas não oferece suporte para criar uma rota eficiente para coletá-los. Acontece que você tem um software de busca de caminhos instalado na sua máquina, só que ele usa um formato de GPS diferente do site de geocaching. Para alimentar o software com os dados, você vai precisar interpretar os graus e o hemisfério tanto da latitude quanto da longitude de cada coordenada de GPS no site.
Sua 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 ponto flutuante no intervalo de 0 a 90 (inclusive)<LATITUDE_HEMISPHERE>: N ou S
<LONGITUDE_DEGREES>: um número de ponto flutuante no intervalo de 0 a 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>: EVocê tem 11 tarefas, nas quais vai analisar coordenadas de GPS de forma incremental. Você vai usar o suporte do Prolog a Gramática de Cláusulas Definidas (DCG), que serve para analisar texto estruturado.
Para ajudar você a começar, o arquivo stub já inclui a biblioteca dcg/basics por meio de:
:- use_module(library(dcg/basics)).
Implemente a regra comma para analisar uma única vírgula (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Implemente a regra space para analisar um único espaço (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Modifique a regra space para analisar todos os espaços em branco, exceto quebras de linha:
?- 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 como os átomos north ou south.
Implemente 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 como os átomos east ou west.
Implemente 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 ponto flutuante.
Implemente a regra degrees para analisar números de ponto flutuante:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Os graus da latitude não são apenas números de ponto flutuante, mas números de ponto flutuante no intervalo de 0 a 90 (inclusive).
Implemente a regra latitude_degrees para analisar os graus da 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 da longitude não são apenas números de ponto flutuante, mas números de ponto flutuante no intervalo de 0 a 180 (inclusive).
Implemente a regra longitude_degrees para analisar os graus da 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.
Implemente 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.
Implemente 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.
Implemente 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.
Crie sua conta no Exercism para aprender e dominar Prolog com 109 exercícios e mentoria humana de verdade, tudo de graça.