Rutas
/
Roc
Roc
/
Ejercicios
/
Análisis de SGF
Análisis de SGF

Análisis de SGF

Difícil

Instrucciones

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:

  • El nodo de nivel superior tiene tres propiedades: FF[4] (clave = «FF», valor = «4»), C[root](clave = «C», valor = «root») y SZ[19] (clave = «SZ», valor = «19»). (FF indica la versión de SGF, C es un comentario y SZ es el tamaño del tablero).
    • El nodo de nivel superior tiene un único hijo que tiene una única propiedad: B[aa]. (Las negras juegan en el punto codificado como «aa», que es el punto 1-1).
      • El nodo B[aa] tiene un único hijo que tiene una única propiedad: W[ab].

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:

  • Los saltos de línea se eliminan si vienen inmediatamente después de un \; de lo contrario, se mantienen como saltos de línea.
  • Todos los caracteres de espacio en blanco distintos del salto de línea se convierten en espacios.
  • \ 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:

  • El string tal como se representa en un literal de string de los tests
  • El string que se pasa al analizador de SGF

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.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Roc Exercism

¿Listo para empezar Análisis de SGF?

Regístrate en Exercism para aprender y dominar Roc con 120 ejercicios y mentoría humana real, todo gratis.