Analyser une string au format Smart Game Format.
SGF est un format standard pour stocker des fichiers de jeux de plateau, en particulier le go.
SGF est un format assez simple. Un fichier SGF contient généralement un seul arbre de nœuds, chaque nœud étant une liste de propriétés. La liste de propriétés contient des paires clé-valeur ; chaque clé ne peut apparaître qu'une seule fois, mais elle peut avoir plusieurs valeurs.
Cet exercice te demandera d'analyser une string SGF et de renvoyer une structure de propriétés sous forme d'arbre.
Un fichier SGF peut ressembler à ceci :
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Il s'agit d'un arbre à trois nœuds :
Comme tu peux l'imaginer, un fichier SGF contient beaucoup de nœuds avec un seul enfant, d'où l'existence d'une notation abrégée.
SGF peut encoder des variantes de jeu. Les joueurs de go reviennent beaucoup en arrière dans leurs analyses (« essayons ceci, ça ne marche pas, essayons cela »), et SGF prend en charge les variantes dans les séquences de jeu. Par exemple :
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Ici, le nœud racine a deux variantes. La première (qui, par convention, indique ce qui a réellement été joué) est celle où Noir joue en 1-1. Noir a reçu ce fichier de son professeur, qui lui a signalé un coup plus judicieux dans le deuxième enfant du nœud racine : B[dd] (point 4-4, une ouverture très classique pour prendre le coin).
Une clé peut avoir plusieurs valeurs associées. Par exemple :
(;FF[4];AB[aa][ab][ba])
Ici, AB (ajouter des pierres noires) sert à ajouter trois pierres noires au plateau.
Toutes les valeurs de propriété seront du type Text de SGF. Tu n'as pas besoin d'implémenter d'autre type de valeur. Tu peux consulter la documentation complète du type Text, mais voici un résumé des points importants :
\, sinon ils sont conservés en tant que sauts de ligne.\ est le caractère d'échappement.
Tout caractère autre qu'un espace après \ est inséré tel quel.
Tout caractère d'espacement après \ suit les règles ci-dessus.
À noter que SGF n'a pas de séquences d'échappement pour les caractères d'espacement comme \t ou \n.Fais attention à ne pas confondre :
Les séquences d'échappement présentes dans les littéraux de chaîne de caractères ont peut-être déjà été traitées par l'analyseur du langage de programmation avant d'être transmises à l'analyseur SGF.
SGF (et l'analyse en général) comporte quelques autres subtilités que tu peux ignorer dans la plupart des cas. Tu peux supposer que l'entrée est encodée en UTF-8 : les tests ne contiendront pas de propriété de jeu de caractères, donc ne t'en préoccupe pas. De plus, tu peux supposer que tous les sauts de ligne sont au format unix (\n, aucun \r ni \r\n dans les tests) et qu'aucun espace optionnel entre les propriétés, les nœuds, etc. ne figurera dans les tests.
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.