Chomp é um jogo para dois jogadores com uma configuração de um retângulo de peças. Cada jogador remove uma peça, juntamente com todas as peças acima e à direita. Quem pega a peça inferior esquerda perde. É fácil provar que o primeiro jogador sempre tem uma jogada vencedora (exceto com um retângulo 1 por 1); encontre.
- Entrada é as dimensões do retângulo (dois números)
- Saída é o local da jogada vencedora (dois números)
- Se houver mais de uma jogada vencedora, você poderá gerar uma delas.
Isso é código de golfe; o código mais curto (qualquer idioma) vence.
Exemplos
Nota: As saídas são apenas os dois números; a arte ASCII abaixo é apenas para demonstrar o que os números significam.
Entrada: 5 3 (índices 1 com base no canto inferior esquerdo)
Saída: 4 3
XXX--
XXXXX
XXXXX
Entrada: 4 4
Saída: 2 2
X---
X---
X---
XXXX
Bônus
Subtraia 15 caracteres da sua pontuação se você exibir todos os movimentos vencedores. Cada par de números deve ser separado por uma nova linha.
Respostas:
GolfScript, 82 (
10897 caracteres - 15 bônus)Como eu não conhecia nenhuma heurística, esta solução realiza uma pesquisa exaustiva no espaço da solução. Você pode tentar o código online . Embora a implementação seja muito eficiente, o espaço de pesquisa cresce muito rapidamente com o aumento da entrada.
Exemplos:
Como mencionado acima, a implementação não depende de recursão, mas visita cada nó do espaço de pesquisa apenas uma vez. Abaixo, você encontra uma versão anotada do código que descreve os blocos de construção em mais detalhes.
A representação de uma única placa de tamanho w * h é dada por uma lista de números w no intervalo de 0 a h . Cada número fornece a quantidade de peças na coluna correspondente. Portanto, uma configuração válida é uma lista em que os números não aumentam do início ao fim (com qualquer movimento, você garante que todas as colunas à direita sejam no máximo tão altas quanto a escolhida).
fonte
Python
23, 141-15 = 126Pesquisa minimax de força bruta. Para cada jogada possível, vemos recursivamente se o oponente pode vencer depois de fazer essa jogada. Golfe fraco; alguém deve ser capaz de fazer muito melhor. Isso parece um trabalho para a APL.
win
é a interface pública. Ele pega as dimensões do quadro, converte-o em uma representação do quadro e passa isso paraw
.w
é o algoritmo minimax. Leva um estado do tabuleiro, tenta todas as jogadas, cria uma lista cujos elementos correspondem às jogadas vencedoras e retorna True se a lista estiver vazia. Com o padrãof=print
, a criação da lista tem um efeito colateral de imprimir os movimentos vencedores. O nome da função costumava fazer mais sentido quando ele retornava uma lista de movimentos vencedores, mas depois movi onot
na frente da lista para economizar espaço.for r,p in enumerate(b)for c in xrange(p) if(r+c)
: Itere sobre todos os movimentos possíveis.1 1
é tratado como não uma jogada legal, simplificando um pouco o caso base.b[:r]+[min(i,c)for i in b[r:]]
: Construa o estado do quadro após a movimentação representada pelas coordenadasr
ec
.w(b[:r]+[min(i,c)for i in b[r:]],max)
: Recursão para ver se o novo estado é um estado perdedor.max
é a função mais curta que eu poderia achar que levaria dois argumentos inteiros e não reclamaria.f(r+1,c+1)
: Sef
estiver impresso, imprime a movimentação. Seja o quef
for, produz um valor para preencher o comprimento da lista.not [...]
:not
retornaTrue
para listas vazias eFalse
não vazias.Código original do Python 2, completamente despojado, incluindo memorização para lidar com entradas muito maiores:
Demo:
fonte
13x13
tomada2x2
e você venceria.Perl 6:
113108 caracteres - 15 = 93 pontosEste foi difícil! Aqui está a versão não armazenada em cache, que é tecnicamente correta, mas levará muito tempo para entradas não triviais.
Funciona exatamente como a implementação em Python do @ user2357112 (com o voto positivo , eu não poderia ter descoberto isso sem o trabalho dele / dela!), Exceto que o win () pega uma placa Chomp (matriz) em vez de uma largura e comprimento. Pode ser usado como:
Uma versão com memorização, que pode realmente lidar com entradas decentes (embora não seja otimizada para facilitar a leitura):
fonte