Introdução
Um quebra-cabeça comum envolve uma placa triangular com 15 furos para tees / pegs, conforme mostrado na imagem abaixo:
Começando com todos os pinos no tabuleiro, com exceção de um buraco no topo, o objetivo do quebra-cabeça é pular pinos uns sobre os outros como damas, de modo a deixar exatamente um pino à esquerda. O único movimento válido é pular uma estaca sobre uma estaca adjacente em qualquer direção para um buraco vazio. O pino que foi pulado é então removido do tabuleiro. O jogo termina quando não houver jogadas válidas.
Spec
Seu trabalho é escrever um programa que encontre uma solução completa para o quebra-cabeça do pino, ou seja, um que deixe exatamente um pino à esquerda. Existem várias soluções possíveis, portanto, seu programa só precisa imprimir uma.
- Seu programa não receberá nenhuma entrada. Você não tem permissão para ler dados de nenhuma fonte externa.
- Imprima a lista de 13 movimentos que resultam em 1 peg restante usando este formato:
Peg 1 jumps Peg 3 to Hole 6.
- Os furos / pinos são numerados de cima para baixo, da esquerda para a direita, de modo que o pino / furo superior seja 1, numerando até o canto inferior direito ser 15.
- Seu programa deve encontrar a solução em tempo de execução . Imprimir uma solução diretamente por qualquer outro meio que não seja resolvê-la no programa é uma desqualificação automática.
- Bônus : receba 10 pontos de bônus se puder gerar várias soluções exclusivas (basta imprimir separadas por linhas em branco).
- Bônus : receba 5 pontos de bônus se o número
15
não aparecer em nenhum lugar no seu código-fonte.
Pontuação
Isso é código-golfe, então a solução mais curta (por contagem de bytes) que imprime uma resposta correta será a vencedora. Os pontos de bônus são subtraídos da sua contagem total de bytes. Forneça uma amostra de saída da execução do seu programa, bem como um link para ideone
algum site semelhante, se possível, demonstrando a execução do seu programa.
fonte
15=0xff=(1<4)-1=~(-1<<4)=...
15
si mesmo;)Respostas:
Ruby, pontuação
240238234 = 249 - 10 - 5Uma implementação simples de ruby que imprime todas as soluções possíveis para esse quebra-cabeça (leva menos de um minuto no meu computador). As primeiras linhas de saída podem ser vistas aqui:
E o exemplo online pode ser encontrado aqui .
fonte
Python, 324 caracteres, pontuação = 319
O estado do peg é mantido como uma máscara de bits.
M
contém uma lista de estados de peg e as instruções para chegar a esse estado.Eu também conseguia imprimir todas as soluções (existem 29760), mas custaria mais de 10 caracteres para fazê-lo.
Não posso publicá-lo no ideone, pois leva cerca de 90 segundos para ser executado.
Resultado:
fonte
C, 386 caracteres, pontuação = 371
Imprime todas as soluções 29760, em menos de um segundo.
Esta versão assume (entre outras coisas) que o compilador permitirá a declaração implícita de printf (). Cerca de seis outros caracteres podem ser salvos usando o implit-int, mas esse recurso foi tecnicamente removido do C99.
Além disso, mais quatro bytes podem ser salvos substituindo as letras maiúsculas nas duas seqüências pelos caracteres de controle correspondentes. Não fiz isso aqui porque os compiladores não precisam permitir essas seqüências e isso torna o código-fonte já denso completamente ilegível.
Para maior clareza, eis o mesmo algoritmo sem as otimizações de tamanho mais ofuscantes:
f, o e t são a lista de saltos legais inicializados no primeiro loop. re formam a história que o programa usa para voltar atrás e explorar todos os jogos possíveis.
Tenho certeza que isso pode ser melhorado!
fonte
>>1
por/2
.