Tracks
/
Prolog
Prolog
/
Übungen
/
Global Positioning System
Global Positioning System

Global Positioning System

Mittel

Einführung

Du bist ein großer Fan von Geocaching, das deine Liebe zur Natur mit der Liebe zum Lösen von Rätseln verbindet. Die lokale Geocaching-Website listet zwar die GPS-Koordinaten aller Caches auf, unterstützt aber nicht das Erstellen einer effizienten Route, um sie alle einzusammeln. Zufälligerweise hast du eine Wegfindungssoftware auf deinem Rechner installiert, doch sie verwendet ein anderes GPS-Format als die Geocaching-Website. Um die Daten in die Wegfindungssoftware einzuspeisen, musst du die Gradangabe und die Hemisphäre sowohl für den Breitengrad als auch für den Längengrad jeder GPS-Koordinate auf der Website parsen.

Anleitung

Deine Aufgabe ist es, GPS-Koordinaten zu parsen. Jede Koordinate ist im Dezimalgradformat mit expliziten Hemisphären formatiert:

<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>

Das sind die erlaubten Werte für jede einzelne Komponente:

  • <LATITUDE_DEGREES>: eine Gleitkommazahl im Bereich 0..90 (einschließlich)
  • <LATITUDE_HEMISPHERE>: entweder N oder S
  • <LONGITUDE_DEGREES>: eine Gleitkommazahl im Bereich 0..180 (einschließlich)
  • <LONGITUDE_HEMISPHERE>: entweder E oder W

Zum Beispiel wird "48.8584 N, 2.2945 E" geparst zu:

  • <LATITUDE_DEGREES>: 48.8584
  • <LATITUDE_HEMISPHERE>: N
  • <LONGITUDE_DEGREES>: 2.2945
  • <LONGITUDE_HEMISPHERE>: E

Du hast 11 Aufgaben, in denen du GPS-Koordinaten nach und nach parst. Dabei verwendest du die Unterstützung von Prolog für Definite Clause Grammar (DCG), die dafür gedacht ist, strukturierten Text zu parsen.

Note

Damit du direkt loslegen kannst, enthält die Stub-Datei bereits die dcg/basics-Bibliothek über:

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

1. Ein Komma parsen

Implementiere die comma-Regel, um ein einzelnes Komma (",") zu parsen:

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

2. Ein Leerzeichen parsen

Implementiere die space-Regel, um ein einzelnes Leerzeichen (" ") zu parsen:

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

3. Alle Whitespace-Zeichen unterstützen (außer Zeilenumbrüchen)

Ändere die space-Regel so, dass sie alle Whitespace-Zeichen außer Zeilenumbrüchen parst:

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

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

4. Die Hemisphäre des Breitengrads parsen

Die Hemisphäre des Breitengrads kann entweder "N" oder "S" sein, was zum Atom north oder south geparst werden soll. Implementiere die latitude_hemisphere-Regel, um die Hemisphäre des Breitengrads zu parsen:

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

5. Die Hemisphäre des Längengrads parsen

Die Hemisphäre des Längengrads kann entweder "E" oder "W" sein, was zum Atom east oder west geparst werden soll. Implementiere die longitude_hemisphere-Regel, um die Hemisphäre des Längengrads zu parsen:

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

6. Gradangaben parsen

Die Gradangabe eines Längengrads oder Breitengrads ist als Gleitkommazahl definiert. Implementiere die degrees-Regel, um Gleitkommazahlen zu parsen:

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

7. Gradangaben des Breitengrads parsen

Gradangaben des Breitengrads sind nicht einfach Gleitkommazahlen, sondern Gleitkommazahlen im Bereich 0..90 (einschließlich). Implementiere die latitude_degrees-Regel, um Gradangaben des Breitengrads mit dem obigen Bereich zu parsen:

?- 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. Gradangaben des Längengrads parsen

Gradangaben des Längengrads sind nicht einfach Gleitkommazahlen, sondern Gleitkommazahlen im Bereich 0..180 (einschließlich). Implementiere die longitude_degrees-Regel, um Gradangaben des Längengrads mit dem obigen Bereich zu parsen:

?- 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. Einen Breitengrad parsen

Breitengrade haben zwei Teile: ihre Gradangabe und ihre Hemisphäre, die durch ein Leerzeichen getrennt sind. Implementiere die latitude-Regel, um einen Breitengrad zu parsen:

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

10. Einen Längengrad parsen

Breitengrade haben zwei Teile: ihre Gradangabe und ihre Hemisphäre, die durch ein Leerzeichen getrennt sind. Implementiere die latitude-Regel, um einen Breitengrad zu parsen:

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

11. Eine Koordinate parsen

Koordinaten haben zwei Teile: ihren Breitengrad und ihren Längengrad, die durch ein Komma gefolgt von einem Leerzeichen getrennt sind. Implementiere die coordinate-Regel, um sowohl den Breitengrad (Gradangabe und Hemisphäre) zu parsen:

?- 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.
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Prolog Exercism

Bereit, mit Global Positioning System zu starten?

Melde dich bei Exercism an, um Prolog mit 109 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.