Eine Zeichenkette im Smart Game Format parsen.
SGF ist ein Standardformat zum Speichern von Dateien für Brettspiele, insbesondere Go.
SGF ist ein ziemlich einfaches Format. Eine SGF-Datei enthält normalerweise einen einzelnen Baum aus Knoten, wobei jeder Knoten eine Eigenschaftsliste ist. Die Eigenschaftsliste enthält Schlüssel-Wert-Paare. Jeder Schlüssel darf nur einmal vorkommen, kann aber mehrere Werte haben.
In dieser Übung parst du eine SGF-Zeichenkette und gibst eine Baumstruktur aus Eigenschaften zurück.
Eine SGF-Datei kann so aussehen:
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Das ist ein Baum mit drei Knoten:
Wie du dir vorstellen kannst, enthält eine SGF-Datei viele Knoten mit einem einzelnen Kind, deshalb gibt es dafür eine Kurzschreibweise.
SGF kann Variationen des Spiels kodieren. Go-Spieler gehen beim Nachspielen viel zurück (probieren wir das, klappt nicht, probieren wir jenes), und SGF unterstützt Variationen von Zugfolgen. Zum Beispiel:
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Hier hat der Wurzelknoten zwei Variationen. Die erste (die per Konvention
angibt, was tatsächlich gespielt wird) ist die, in der Schwarz auf 1-1 spielt.
Schwarz bekam diese Datei von seinem Lehrer geschickt, der auf einen
sinnvolleren Zug im zweiten Kind des Wurzelknotens hinwies: B[dd] (4-4-Punkt,
eine sehr übliche Eröffnung, um sich die Ecke zu sichern).
Ein Schlüssel kann mehrere zugehörige Werte haben. Zum Beispiel:
(;FF[4];AB[aa][ab][ba])
Hier wird AB (Schwarz hinzufügen) verwendet, um drei schwarze Steine auf dem
Brett hinzuzufügen.
Alle Eigenschaftswerte sind vom SGF-Texttyp. Andere Werttypen musst du nicht implementieren. Du kannst die vollständige Dokumentation des Texttyps lesen, aber eine Zusammenfassung der wichtigsten Punkte findest du unten:
\ stehen, andernfalls bleiben sie als Zeilenumbrüche erhalten.\ ist das Escape-Zeichen.
Jedes Nicht-Whitespace-Zeichen nach \ wird unverändert eingefügt.
Jedes Whitespace-Zeichen nach \ folgt den oben genannten Regeln.
Beachte, dass SGF keine Escape-Sequenzen für Whitespace-Zeichen wie \t oder \n hat.Verwechsle nicht:
Escape-Sequenzen in den String-Literalen wurden möglicherweise schon vom Parser der Programmiersprache verarbeitet, bevor sie an den SGF-Parser übergeben werden.
SGF (und das Parsen im Allgemeinen) hat noch ein paar weitere Feinheiten, die
du größtenteils ignorieren kannst. Du kannst davon ausgehen, dass die Eingabe in
UTF-8 kodiert ist, die Tests keine Charset-Eigenschaft enthalten, darum musst du
dich also nicht kümmern. Außerdem kannst du davon ausgehen, dass alle
Zeilenumbrüche im Unix-Stil sind (\n, in den Tests kommen kein \r oder
\r\n vor) und dass in den Tests keine optionalen Whitespaces zwischen
Eigenschaften, Knoten usw. vorkommen.
Melde dich bei Exercism an, um Roc mit 120 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.