Esse desafio é escrever uma função minimax no idioma de sua escolha, para produzir a próxima melhor jogada em um jogo NxN de jogo da velha, considerando o estado atual do tabuleiro . A entrada da placa pode ser aceita como uma matriz, uma coleção 2D ou qualquer outra coisa que faça sentido para você, mas siga as regras . A saída é a próxima melhor jogada para quem quer que seja , atualmente , onde X é considerado como tendo iniciado .
Antecedentes Rápidos do Algoritmo Minimax
A idéia básica do algoritmo minimax é enumerar todos os resultados possíveis como um DAG e ponderá-los pelo benefício que a sequência de movimentos tem para o jogador, codificada pelo primeiro movimento realizado. Todos os resultados possíveis são 'agrupados' pela primeira jogada e são pontuados com base na soma de todos os resultados (-1 para uma perda, 0 para um empate e 1 para uma vitória). Nas implementações que exigem que vários jogadores joguem, você enumera todos os movimentos possíveis pelo jogador e todas as respostas possíveis dos adversários. Por exemplo, em um jogo do jogo da velha (após o primeiro movimento), existem 8 possíveis primeiros movimentos que você pode fazer, e todos podem parecer iguais ao analisar apenas o próximo turno. Mas iterando todos os resultados possíveis para cada conjunto de movimentos possível que resulta em um resultado final e resumindo todos eles,
Para um resumo melhor, mais aprofundado e contextual do algoritmo mini-max em termos de jogo da velha, leia mais aqui: http://neverstopbuilding.com/minimax
XKCD (somente solução 3x3)
As regras
- Qualquer idioma pode ser usado, mas nenhuma biblioteca minimax externa é permitida.
- A saída pode ser uma coordenada (0-n, 0-n) ou um número (1-n * n) indicativo da melhor jogada seguinte.
- Além disso, você deve ser capaz de identificar quando o melhor cenário é uma perda ou um empate, em vez de uma vitória.
- A maneira como você denota uma perda ou um empate depende, mais uma vez, de você.
- A entrada deve usar o X e O tradicional e você deve assumir que X se move primeiro; espaços em branco podem ser representados por qualquer coisa.
- Você pode assumir que todas as entradas que entram no seu programa têm n O e n + 1 X, ou seja, você pode assumir que está obtendo um quadro bem formado.
- O estado atual da placa deve ser a única entrada para o seu programa; se você estiver usando recursão, métodos auxiliares deverão ser feitos para facilitar os requisitos de entrada. Consulte /codegolf//a/92851/59376 para obter esclarecimentos.
- Qualquer valor de 10> = n> = 1 deve ser suportado; se o seu programa "exceder o tempo limite" para n> 10, também acho isso aceitável, pois alguns idiomas têm um poder de processamento significativamente menor (especialmente usando consoles da Web).
A julgar
- Isso é código-golfe, portanto a contagem de bytes mais baixa do programa vence e as brechas padrão são universalmente proibidas.
- Em caso de empate, o programa que suportar o maior 'n' vencerá.
Exemplo de entradas
2x2
[[X,O]
[-,-]]
Saída: 2 ou [0,1] (3 ou [1,1] também seria discutivelmente correto) (Alguma forma de indicação da localização, arbitrária, desde que você possa explicar facilmente o formato usado)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Saída: -1 (perda)
Mais uma vez, qualquer formato de entrada desejado é permitido, mas X e O devem ser usados, os exemplos fornecidos não foram feitos para restringir esse formato, apenas para inspirar.