Análisis de un string de Smart Game Format.
SGF es un formato estándar para almacenar archivos de juegos de mesa, en particular el go.
SGF es un formato bastante sencillo. Un archivo SGF suele contener un único árbol de nodos, donde cada nodo es una lista de propiedades. La lista de propiedades contiene pares de clave y valor; cada clave solo puede aparecer una vez, pero puede tener varios valores.
El ejercicio te pedirá que analices un string de SGF y devuelvas una estructura de árbol de propiedades.
Un archivo SGF puede tener este aspecto:
(;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 único hijo, y por eso existe una forma abreviada de escribirlo.
SGF puede codificar variantes de juego. Los jugadores de go retroceden mucho cuando analizan sus partidas (vamos a probar 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 se jugó realmente) es donde las negras juegan en 1-1. Un 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 hacerse con la esquina).
Una clave puede tener varios valores asociados. Por ejemplo:
(;FF[4];AB[aa][ab][ba])
Aquí AB (añadir negras) se usa para añadir 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 tienes un resumen de los puntos importantes:
\; de lo contrario, se mantienen como saltos de línea.\ es el carácter de escape.
Cualquier carácter que no sea un 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 pasarlas al analizador de SGF.
Hay algunas complejidades más en SGF (y en el análisis sintáctico en general) que
puedes ignorar en su mayor parte. Debes suponer que la entrada está codificada en
UTF-8 y que los tests no contendrán ninguna propiedad de conjunto de caracteres, así que no te preocupes por
eso. Además, puedes suponer que todos los saltos de línea son de estilo Unix (\n;
en los tests no habrá ningún \r ni \r\n) y que los tests 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.