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

Análisis de SGF

Difícil

Instrucciones

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:

  • 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 solo hijo, que a su vez tiene una sola propiedad: B[aa]. (Las negras juegan en el punto codificado como «aa», que es el punto 1-1).
      • El nodo B[aa] tiene un solo hijo, que tiene una sola propiedad: W[ab].

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:

  • Los saltos de línea se eliminan si vienen inmediatamente después de un \; de lo contrario, se conservan 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 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 en las pruebas
  • 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 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.

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

¿Todo 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.