트랙
/
Prolog
Prolog
/
연습 문제
/
위성 위치 확인 시스템
위성 위치 확인 시스템

위성 위치 확인 시스템

보통

소개

지오캐싱은 야외 활동을 좋아하는 마음과 퍼즐 풀기의 재미를 한데 모아 주는 취미예요. 아마 이 취미의 열렬한 팬이겠죠. 그런데 지역 지오캐싱 웹사이트는 모든 캐시의 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) 지원 기능을 사용하게 돼요.

Note

시작하는 데 도움이 되도록, 스텁 파일에는 이미 다음 코드로 dcg/basics 라이브러리가 포함되어 있어요:

:- use_module(library(dcg/basics)).

1. 쉼표 파싱하기

comma 규칙을 구현해서 쉼표 하나(",")를 파싱해요:

?- string_codes(",", Codes), phrase(comma, Codes).

2. 공백 파싱하기

space 규칙을 구현해서 공백 하나(" ")를 파싱해요:

?- string_codes(" ", Codes), phrase(space, Codes).

3. 모든 공백 문자 지원하기(줄 바꿈 제외)

space 규칙을 수정해서 줄 바꿈을 제외한 모든 공백 문자를 파싱하도록 해요:

?- string_codes("\t", Codes), phrase(space, Codes).

?- string_codes("\n", Codes), phrase(space, Codes).
false.

4. 위도의 반구 파싱하기

위도의 반구는 "N" 또는 "S"일 수 있고, 각각 north 또는 south 원자로 파싱되어야 해요. latitude_hemisphere 규칙을 구현해서 위도의 반구를 파싱해요:

?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.

5. 경도의 반구 파싱하기

경도의 반구는 "E" 또는 "W"일 수 있고, 각각 east 또는 west 원자로 파싱되어야 해요. longitude_hemisphere 규칙을 구현해서 경도의 반구를 파싱해요:

?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.

6. 도 파싱하기

경도나 위도의 도는 실수로 정의돼요. degrees 규칙을 구현해서 실수를 파싱해요:

?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.

7. 위도의 도 파싱하기

위도의 도는 단순한 실수가 아니라 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.

8. 경도의 도 파싱하기

경도의 도는 단순한 실수가 아니라 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.

9. 위도 파싱하기

위도는 도와 반구, 두 부분으로 이루어져 있고, 두 부분은 공백으로 구분돼요. latitude 규칙을 구현해서 위도를 파싱해요:

?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.

10. 경도 파싱하기

위도는 도와 반구, 두 부분으로 이루어져 있고, 두 부분은 공백으로 구분돼요. latitude 규칙을 구현해서 위도를 파싱해요:

?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.

11. 좌표 파싱하기

좌표는 위도와 경도, 두 부분으로 이루어져 있고, 두 부분은 쉼표와 공백으로 구분돼요. 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.
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Prolog Exercism

위성 위치 확인 시스템 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Prolog 트랙을 연습 문제 109개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.