Analizar un string del formato Smart Game Format.
SGF es un formato estándar para almacenar archivos de juegos de mesa, en particular de go.
SGF es un formato bastante simple. Por lo general, un archivo SGF contiene un solo árbol de nodos, donde cada nodo es una lista de propiedades. La lista de propiedades contiene pares de clave y valor; cada clave puede aparecer una sola vez, pero puede tener varios valores.
En este ejercicio vas a analizar un string SGF y devolver una estructura de árbol de propiedades.
Un archivo SGF puede verse así:
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Este es un árbol con tres nodos:
Como puedes imaginar, un archivo SGF contiene muchos nodos con un solo hijo, y por eso existe una forma abreviada de escribirlo.
SGF puede codificar variantes de juego. Quienes juegan al go retroceden mucho durante sus repasos (probemos esto, no funciona, probemos aquello) y SGF admite variantes en las secuencias de juego. Por ejemplo:
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Aquí el nodo raíz tiene dos variantes. La primera (que por convención
indica lo que realmente se jugó) es donde las negras juegan en 1-1. Su maestro
le envió este archivo a las negras y le señaló una jugada más sensata en
el segundo hijo del nodo raíz: B[dd] (punto 4-4, una apertura
muy estándar para tomar la esquina).
Una clave puede tener varios valores asociados. Por ejemplo:
(;FF[4];AB[aa][ab][ba])
Aquí AB (agregar negras) se usa para agregar tres piedras negras al tablero.
Todos los valores de las propiedades serán del tipo Text de SGF. No necesitas implementar ningún otro tipo de valor. Aunque puedes leer la documentación completa del tipo Text, a continuación hay un resumen de los puntos importantes:
\; de lo contrario, se conservan como saltos de línea.\ es el carácter de escape.
Cualquier carácter que no sea espacio en blanco después de \ se inserta tal cual.
Cualquier carácter de espacio en blanco después de \ sigue las reglas anteriores.
Ten en cuenta que SGF no tiene secuencias de escape para caracteres de espacio en blanco como \t o \n.Ten cuidado de no confundir:
Es posible que el analizador del lenguaje de programación ya haya procesado las secuencias de escape de los literales de string antes de que se pasen al analizador de SGF.
Hay algunas complejidades más en SGF (y en el análisis en general) que
puedes ignorar en su mayor parte. Debes asumir que la entrada está codificada en
UTF-8; las pruebas no contendrán una propiedad charset, así que no te preocupes por
eso. Además, puedes asumir que todos los saltos de línea son de estilo Unix (\n,
no habrá \r ni \r\n en las pruebas) y que las pruebas no incluirán espacios en blanco opcionales
entre propiedades, nodos, etc.
Regístrate en Exercism para aprender y dominar Roc con 120 ejercicios y mentoría humana real, todo gratis.