Este desafio é sobre o jogo Tic Tac Toe, mas é jogado em um toro.
Como jogar
Para criar o tabuleiro necessário, comece com um tabuleiro regular de jogo da velha. Primeiro dobre-o em um cilindro juntando as bordas esquerda e direita. Em seguida, dobre-o em toro juntando a borda superior e inferior. Aqui está uma visualização simples desse tabuleiro de jogo com alguns movimentos jogados (habilidades do Sick Paint!).
As regras do Tic Tac Toe em um toro são as mesmas do Tic Tac Toe comum. Cada jogador coloca Xs e Os alternados. O primeiro com 3 mesmos símbolos seguidos, uma coluna ou um na diagonal vence.
Como um toro é bastante difícil de visualizar, simplesmente projetamos o cartão de volta em um papel. Agora podemos jogar o jogo como Tic Tac Toe regular. A única diferença é que você também pode ganhar com 3 mesmos símbolos em uma diagonal quebrada. Por exemplo, o Jogador 1 (X) vence o seguinte quadro. Você pode ver isso facilmente, alterando um pouco a visão no toro.
Se você estiver interessado, você pode jogar Tic Tac Toe em um Torus nos Torus Games . Existe uma versão para Windows, Mac e Android.
Optimal Games
Neste desafio estavam interessados em jogos ótimos. Um jogo ideal é um jogo em que ambos os jogadores jogam uma estratégia ideal. Em um tabuleiro regular de Tic Tac Toe, os jogos ideais sempre terminam em empate. Fascinantemente em um toro sempre o primeiro jogador vence. De fato, um jogo em um tabuleiro de toro nunca pode terminar em empate (também se os jogadores não jogarem o ideal).
A estratégia ideal é realmente fácil:
- Se você pode ganhar colocando seu símbolo, faça-o.
- Caso contrário, se o seu oponente tiver dois símbolos em uma linha / coluna / diagonal, tente bloqueá-lo. Caso contrário, faça o que quiser.
- Caso contrário, faça o que quiser.
Todo jogo ideal consiste em exatamente 7 jogadas e essas jogadas podem ser descritas da seguinte maneira:
- O jogador 1 coloca um X em qualquer lugar do tabuleiro (9 opções)
- O jogador 2 coloca um O em qualquer lugar do tabuleiro (8 opções)
- O jogador 1 coloca um X em qualquer lugar do tabuleiro (7 opções)
- O movimento do jogador 2 pode ser forçado (1 opção); caso contrário, ele coloca o O em qualquer lugar (6 opções)
- A jogada do jogador 1 é forçada (1 escolha)
- O jogador 2 está preso em um garfo (o jogador 1 pode vencer de duas maneiras diferentes); portanto, o jogador 2 precisa bloquear o jogador 1 de uma maneira (2 opções)
- O jogador 1 coloca seu último lance e ganha (1 escolha)
Existem 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 jogos ótimos diferentes em nosso quadro projetado. Aqui você pode ver um jogo ideal típico:
Se rotularmos cada célula do tabuleiro com os dígitos 0-8
, podemos descrever esse jogo pelos dígitos 3518207
. Primeiro, um X é um local na célula 3 (linha do meio, coluna da esquerda), que um O na célula 5 (linha do meio, coluna da direita), que um X na célula 1 (linha superior, coluna do meio), ...
Usando essa notação de dígito, geramos automaticamente um pedido. Agora podemos classificar todos os 1728 jogos ideais e temos a lista:
Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
...
Game 0674: 3518207
...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
...
Game 1726: 8765034
Game 1727: 8765043
Desafio
Esta lista faz parte do seu trabalho. Você receberá um número k
entre 0 e 1727 e precisará retornar o k
jogo em notação de dígitos dessa lista classificada.
Escreva uma função ou um programa que receba o número k
( número inteiro) calcule o jogo correspondente. Você pode ler a entrada via STDIN, argumento de linha de comando, argumento de prompt ou função e imprimir o resultado (7 dígitos) em um formato legível (por exemplo, 0123845
ou [0, 1, 2, 3, 8, 4, 5]
) ou retorná-lo usando uma sequência (formato legível por humanos) ou um número inteiro (contendo todos os dígitos na base 10) ou em qualquer formato de matriz / lista.
O tipo de desafio é o código-golfe. Portanto, o código mais curto vence.
fonte
Respostas:
JavaScript (ES6),
266308317333434Uma função retornando uma string. Edit Encontrou uma solução aritmética para a função M (finalmente!)
Muito ingênuo
, pode ser reduzido de várias maneiras. Simplesmente enumera todos os possíveis valores legais e retorna o que é encontrado no local n. A função M retorna a posição entre duas células, que é o movimento obrigatório para bloquear um jogador oposto.Mais legível
fonte
Oitava,
467369363309297caracteres297:
A única mudança relevante é que nunca verificamos se o jogador atual pode vencer, apenas verificamos a possibilidade do adversário de vencer no próximo turno . Como o único turno que o jogador pode vencer é o turno 7 , este é o único local em que o algoritmo produziria um jogo que não é ideal, mas é muito fácil filtrar essa situação. Simplesmente verificamos cada jogo gerado se ele foi vencido pelo jogador 1 - se não foi, a jogada por sua vez 7 foi incorreta, por isso não adicionamos esse jogo à tabela de jogos ideal.
(Exatamente metade dos jogos gerados por esta regra é falsa, ou seja, no 7º turno, o jogador 1 sempre tem duas possibilidades de bloquear o jogador dois, mas apenas um o fará vencer instantaneamente).
Usar:
O código ungolfed se parece com:
fonte