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.
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>: EDu 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.
Damit du direkt loslegen kannst, enthält die Stub-Datei bereits die dcg/basics-Bibliothek über:
:- use_module(library(dcg/basics)).
Implementiere die comma-Regel, um ein einzelnes Komma (",") zu parsen:
?- string_codes(",", Codes), phrase(comma, Codes).
Implementiere die space-Regel, um ein einzelnes Leerzeichen (" ") zu parsen:
?- string_codes(" ", Codes), phrase(space, Codes).
Ä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.
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.
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.
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.
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.
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.
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.
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.
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.
Melde dich bei Exercism an, um Prolog mit 109 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.