Analisar uma string no formato Smart Game Format.
SGF é um formato padrão para armazenar arquivos de jogos de tabuleiro, em particular o go.
O SGF é um formato bastante simples. Normalmente, um arquivo SGF contém uma única árvore de nós, em que cada nó é uma lista de propriedades. A lista de propriedades contém pares de chave e valor; cada chave só pode aparecer uma vez, mas pode ter vários valores.
Neste exercício, você vai analisar uma string SGF e retornar uma estrutura de árvore de propriedades.
Um arquivo SGF pode ser assim:
(;FF[4]C[root]SZ[19];B[aa];W[ab])
Esta é uma árvore com três nós:
Como você pode imaginar, um arquivo SGF contém muitos nós com um único filho, e é por isso que existe uma forma abreviada para isso.
O SGF pode codificar variações de jogo. Jogadores de go voltam muito atrás nas suas revisões (vamos tentar isto, não funciona, vamos tentar aquilo) e o SGF dá suporte a variações de sequências de jogadas. Por exemplo:
(;FF[4](;B[aa];W[ab])(;B[dd];W[ee]))
Aqui, o nó raiz tem duas variações. A primeira (que, por convenção, indica o que foi realmente jogado) é onde as pretas jogam em 1-1. As pretas receberam este arquivo do seu professor, que apontou uma jogada mais sensata no segundo filho do nó raiz: B[dd] (ponto 4-4, uma abertura muito padrão para tomar o canto).
Uma chave pode ter vários valores associados a ela. Por exemplo:
(;FF[4];AB[aa][ab][ba])
Aqui, AB (add black) é usado para adicionar três pedras pretas ao tabuleiro.
Todos os valores de propriedade serão do tipo Text do SGF. Você não precisa implementar nenhum outro tipo de valor. Embora você possa ler a documentação completa do tipo Text, há um resumo dos pontos importantes abaixo:
\; caso contrário, continuam sendo quebras de linha.\ é o caractere de escape.
Qualquer caractere que não seja espaço em branco depois de \ é inserido como está.
Qualquer caractere de espaço em branco depois de \ segue as regras acima.
Note que o SGF não tem sequências de escape para caracteres de espaço em branco, como \t ou \n.Cuidado para não confundir:
As sequências de escape nos literais de string podem já ter sido processadas pelo analisador da linguagem de programação antes de serem passadas para o analisador de SGF.
Existem mais algumas complexidades no SGF (e na análise em geral) que você pode, em grande parte, ignorar. Considere que a entrada está codificada em UTF-8; os testes não vão conter uma propriedade de conjunto de caracteres, então não se preocupe com isso. Além disso, você pode considerar que todas as quebras de linha são no estilo unix (\n; não haverá \r nem \r\n nos testes) e que não haverá espaços em branco opcionais entre propriedades, nós etc. nos testes.
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.