지오캐싱은 야외 활동을 좋아하는 마음과 퍼즐 풀기의 재미를 한데 모아 주는 취미예요. 아마 이 취미의 열렬한 팬이겠죠. 그런데 지역 지오캐싱 웹사이트는 모든 캐시의 GPS 좌표를 알려 주긴 하지만, 캐시를 효율적으로 모을 경로를 만들어 주는 기능은 _지원하지 않아요. 마침 컴퓨터에 경로 탐색 소프트웨어가 설치되어 있는데, 이 소프트웨어는 지오캐싱 웹사이트와는 다른 GPS 형식을 사용해요. 이 데이터를 경로 탐색 소프트웨어에 넣으려면, 웹사이트에 있는 각 GPS 좌표의 위도와 경도에 대해 도 값과 반구를 파싱해야 해요.
GPS 좌표를 파싱하는 것이 이번 과제예요. 각 좌표는 반구를 명시적으로 나타내는 십진 도 형식 변형을 사용해 표현돼요:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
각 구성 요소별로 허용되는 값은 다음과 같아요:
<LATITUDE_DEGREES>: 0부터 90까지(양 끝 포함)의 실수<LATITUDE_HEMISPHERE>: N 또는 S
<LONGITUDE_DEGREES>: 0부터 180까지(양 끝 포함)의 실수<LONGITUDE_HEMISPHERE>: E 또는 W
예를 들어 "48.8584 N, 2.2945 E"는 다음과 같이 파싱돼요:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: E열한 개의 과제가 있고, 이를 통해 GPS 좌표를 점진적으로 파싱하게 돼요. 구조화된 텍스트를 파싱하도록 설계된 Prolog의 한정절 문법(DCG) 지원 기능을 사용하게 돼요.
시작하는 데 도움이 되도록, 스텁 파일에는 이미 다음 코드로 dcg/basics 라이브러리가 포함되어 있어요:
:- use_module(library(dcg/basics)).
comma 규칙을 구현해서 쉼표 하나(",")를 파싱해요:
?- string_codes(",", Codes), phrase(comma, Codes).
space 규칙을 구현해서 공백 하나(" ")를 파싱해요:
?- string_codes(" ", Codes), phrase(space, Codes).
space 규칙을 수정해서 줄 바꿈을 제외한 모든 공백 문자를 파싱하도록 해요:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
위도의 반구는 "N" 또는 "S"일 수 있고, 각각 north 또는 south 원자로 파싱되어야 해요.
latitude_hemisphere 규칙을 구현해서 위도의 반구를 파싱해요:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
경도의 반구는 "E" 또는 "W"일 수 있고, 각각 east 또는 west 원자로 파싱되어야 해요.
longitude_hemisphere 규칙을 구현해서 경도의 반구를 파싱해요:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
경도나 위도의 도는 실수로 정의돼요.
degrees 규칙을 구현해서 실수를 파싱해요:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
위도의 도는 단순한 실수가 아니라 0부터 90까지(양 끝 포함) 범위의 실수예요.
latitude_degrees 규칙을 구현해서 위의 범위를 사용해 위도의 도를 파싱해요:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
경도의 도는 단순한 실수가 아니라 0부터 180까지(양 끝 포함) 범위의 실수예요.
longitude_degrees 규칙을 구현해서 위의 범위를 사용해 경도의 도를 파싱해요:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
위도는 도와 반구, 두 부분으로 이루어져 있고, 두 부분은 공백으로 구분돼요.
latitude 규칙을 구현해서 위도를 파싱해요:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
위도는 도와 반구, 두 부분으로 이루어져 있고, 두 부분은 공백으로 구분돼요.
latitude 규칙을 구현해서 위도를 파싱해요:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
좌표는 위도와 경도, 두 부분으로 이루어져 있고, 두 부분은 쉼표와 공백으로 구분돼요.
coordinate 규칙을 구현해서 위도(도와 반구)를 파싱해요:
?- 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.
Exercism에 가입하고 Prolog 트랙을 연습 문제 109개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.