O quebra-cabeça numérico de Aristóteles é o desafio de preencher cada uma das 19 células em uma grade hexagonal com um número inteiro único entre 1 e 19, de modo que o total ao longo de cada eixo seja 38.
Você pode imaginar o tabuleiro do jogo assim:
E o quebra-cabeça, em essência, é a solução para o seguinte conjunto de quinze equações:
((a + b + c) == 38 && (d + e + f + g) == 38 && (h + i + j + k + l) ==
38 && (m + n + o + p) == 38 && (q + r + s) == 38 && (a + d + h) ==
38 && (b + e + i + m) == 38 && (c + f + j + n + q) ==
38 && (g + k + o + r) == 38 && (l + p + s) == 38 && (c + g + l) ==
38 && (b + f + k + p) == 38 && (a + e + j + o + s) ==
38 && (d + i + n + r) == 38 && (h + m + q) == 38)
Onde cada variável é um número único no conjunto {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
.
Existem várias soluções possíveis e 19!
combinações possíveis de números inteiros; portanto, a força bruta ingênua será impraticável.
Regras:
- Sem codificar a resposta ou procurar a resposta em outro lugar; seu código precisa encontrá-lo por conta própria
- A velocidade não importa, mas você precisa mostrar seus resultados, para que o código que leva 1000 anos para ser executado não o ajude
- Encontre todas as respostas
- Trate respostas idênticas em rotação como idênticas
- Deduzir 5% da sua contagem total de bytes, se você produzir os resultados em um atraente favo de mel
- Menos bytes ganhos
code-golf
game
hexagonal-grid
Michael Stern
fonte
fonte
Respostas:
Haskell
295289Outra resposta semelhante, usando aritmética para obter os hexágonos intermediários. Diferentemente das outras soluções, não testo se essas somas são> 0, basta testar se os hexágonos classificados são iguais ao intervalo [1 .. 19]. a, c e h são restritos, de modo que somente soluções rotacionadas / espelhadas são permitidas. A solução aparece após alguns segundos e, em seguida, espera um minuto ou mais, enquanto decide que não há mais.
Uso em ghci:
Editado para barbear alguns caracteres. 'y 0 t' produz [1 .. 19].
fonte
x>0
verificação, porque classifico a lista incluindo negativos em vez de incrementar uma matriz? Por outro lado, tenho que restringir os intervalos (meusy a b
) para fazer o Haskell executar, o que me custa alguns caracteres. Mas é provável que exista outro idioma que tenha uma classificação interna que me supere trabalhando da mesma maneira (olhando para você, Mathematica).Java
(1517 - 75,85) = 1441,15(1429 - 71,45) = 1357,55(1325 - 66,25) = 1258,75Isso foi divertido.
Imprime todas as soluções exclusivas, com espelhamento e rotação, em um favo de mel agradável (redução de 5%)
Tempo de execução: ~ 0.122s (122 milissegundos) no meu laptop de 4 anos.
Código golfado (a edição percebeu que eu estava estupidamente repetindo meus printfs, os reduzi a um único printf para obter o máximo de golfe) ( nova edição Chamadas reduzidas para Definir funções em funções menores inteligentes, algumas outras otimizações):
Apreciar!
fonte
return;
instrução.return;
declaração arbitrária aumente o comprimento do meu código em 7, seria insano adicioná-la se a resposta verdadeira incluísse todas as 12 soluções que são simplesmente versões rotacionadas / espelhadas uma da outra. Embora a loucura não possa ser descartada, neste caso, a adição dereturn;
foi intencional e, como descrevi, com base no diálogo completo de perguntas e comentários , que você deve analisar antes de lançar acusações. Obrigado!C, 366 bytes (
C ++ 541 450)Compile com
gcc -std=c99 -O3
.Imprime todas as soluções exclusivas de rotação e espelhamento de módulo, no formato
a b c d ...
, um por linha.Tempo de execução: 0,8 segundos no meu computador.
fonte
Matlab:
333320 caracteresEssa é uma abordagem bastante estúpida da força bruta que não usa recursão. Ele cria soluções parciais
z
, impressas no final. Cada coluna é uma solução; os elementos são listados az de cima para baixo. O tempo de execução é de 1-2 horas.Executando no Matlab:
fonte