Sua tarefa é escrever um programa ou função que possa preencher um determinado retângulo com números primos. A width
e height
do rectângulo será o de entrada. A saída deve ser uma lista de height
cadeias consistindo de width
dígitos e espaços. Cada sequência de dígitos horizontal (da esquerda para a direita) e vertical (de cima para baixo) (delimitada por bordas de espaço ou retângulo) de comprimento 2 ou superior deve ser um número primo. Cada número primo pode ser usado apenas uma vez. Zeros à esquerda não são permitidos. Uma nova linha à direita é opcional na saída.
Exemplo:
With input (5, 3) a valid output would be:
11 13
7 0
173
which scores 11, 13, 173, 17, 103 for a total of 5 points.
Ponto:
O tamanho do retângulo para pontuação será 80, 60
. Cada número primo horizontal ou vertical de comprimento 2 ou mais no retângulo recebe um ponto. A resposta com mais pontos vence. Em caso de empate, a resposta mais rápida vencerá.
Regras:
- As brechas padrão são proibidas.
- Seu programa não deve ser projetado para o
80, 60
tamanho. Se eu suspeito que uma resposta é otimizada para esse tamanho, reservo-me o direito de alterar o tamanho do retângulo em até100, 100
. - Os números primos utilizados devem ser números primos reais (não probabilísticos ou pseudo-tempos). Seu programa pode calcular ou verificar números em tempo de execução ou tê-los codificados. O método de encontrar os números primos não é uma parte importante do desafio.
- Sua resposta deve incluir o texto de saída e seu código. Se o seu programa for muito grande, você pode incluir apenas algum código do algoritmo principal, com uma pequena explicação.
Edit: Esclarecido que primos reais necessários. Adicionado tamanho máximo de retângulo.
Edição 2: Esclarecido que código precisa ser publicado.
fonte
Respostas:
Clingo com Python,
160016891740 primosAproximação
Gero um problema gigante de satisfação de restrições e o resolvo usando um solucionador de satisfação de força industrial. Muita mágica foi usada para tornar os solucionadores de satisfação relativamente rápidos (mesmo que o problema seja NP-completo em geral), mas, felizmente, não preciso me preocupar com essa parte.
Especificamente, eu fixo as posições dos dígitos em um padrão projetado para agrupar de perto os números de 4 e 5 dígitos, com números ocasionais de 2 e 3 dígitos no limite, e adiciono restrições dizendo que cada número é um primo distinto. A embalagem atual usa uma grande fração de todos os números primos de 4 dígitos (854 de 1061).
Código
Uso
Aviso: em 80 × 60, leva cerca de 8 minutos e usa 3 GB de memória. Você pode querer começar com tamanhos menores, se quiser vê-lo em execução.
Saída (80 × 60, 1740 primos):
fonte
Smalltalk, 1098 primos
Primeiro, uma boa pergunta difícil - como evidenciado pela falta de respostas não triviais até agora.
Eu tinha uma solução cozinhando no trabalho, mas tive que esperar o longo fim de semana para ter tempo para limpá-la um pouco. Mesmo assim, é bastante "pesado", então desculpe o tamanho desta resposta - felizmente, essa não é uma questão de código-golfe. Havia muitas pequenas dicas ao longo do caminho, mas tenho certeza de que agora está livre de erros, embora haja muito espaço para melhorias e ajustes.
Língua
Minha linguagem de escolha para esse tipo de coisa é Smalltalk - a depuração superior e a capacidade de testar o código supera qualquer outra coisa que eu conheça. Além disso, mesmo os não codificadores podem lê-lo e entender o básico do que está acontecendo. Limitei o código abaixo à parte interessante, porque achei que a abordagem e os resultados seriam mais interessantes do que o código padrão, mas um arquivo do código completo é colado aqui se alguém quiser experimentá-lo (basta salvar como
*.st
e arquive-o em um navegador de arquivos no Pharo). Eu usei o Pharo 4.0, que é FOSS e pode ser baixado do pharo.org para Win / Mac / Linux. Também feliz em colar o código completo aqui, mas usei o "deve incluir o texto de saída e o seu código" como sugestão - deixe-me saber se estou errado.Aproximação
Então, meu pensamento era: e se você pudesse começar no meio, enfiar o máximo de primos longos que pudesse na caixa e seguir seu caminho a partir daí? Vamos começar com um
Box
objeto, contendo ummatrix
de caracteres, e depois usar umStuffer
objeto para tentar preenchê-lo, encontrando o melhorInsertion
(outro objeto) para cada ponto da matriz e para cada primo (começando pelos longos). O Pharo tem boas classesMatrix
ePoint
métodos com vários métodos úteis (embora a maneira matricial de usar a notação de linha principal versus a coordenada xy de pontos possa ficar um pouco confusa se você não for cuidadoso).As etapas básicas do meu algoritmo são:
Stuffer
instância para determinadas dimensões.Configurável:
Para a matriz abaixo, usei 80x60, números primos abaixo de 20.000 (já que o comprimento combinado deles é um pouco abaixo de 10.000 caracteres, ou seja, o máximo para uma caixa de 100x100 cheia, embora inválida) e, após algumas experiências, a seguinte classificação para
each
inserção :onde
accidentalPrimes
estão os números primos perpendiculares "acidentalmente" criados ao inserir entre números primos vizinhos enumberOfOverlaps
quantos caracteres são substituídos (por exemplo, ao adicionar um3
no final de11
inserir113
). Inicialmente, eu pesava maisaccidentalPrimes
, mas consegui mais alguns números primos ao fazê-lo dessa maneira - não sei exatamente por que (sinta-se à vontade para testar / ajustar).Resultado
Essa matriz contém 1098 primos, que é uma "carga" de cerca de 70%.
Estes são os números primos (
box primesUsed asSortedCollection printString
):Como você pode ver, alguns dos primos "acidentais" ficam muito longos ... 20 dígitos para o mais longo. :-)
Detalhes
Para entender como funciona, aqui está o resultado de executar as primeiras etapas - inserindo
19997
primeiro (se você olhar no meio da grande matriz, também verá19997
), e depois na lista onde há espaço no 5x5 box (>
significa inserir indo para a direita,v
significa ir para baixo; qualquer coisa em{}
são adicionados primos acidentalmente:Na inserção imediatamente acima, a caixa se torna um 7x7 e é preenchida com o conteúdo 5x5 antes da próxima inserção. Também recalculo os números primos usados neste momento, porque alguns são "liberados" devido à substituição (
11
foi inserido, mas substituído por113
).Código
Aqui estão as partes mais relevantes do código:
Classe Stuffer
Lado da classe
Lado da instância
Classe de caixa
Lado da instância
Coleção
Ah, e eu adicionei um método ao lado da instância
Collection
, apenas por conveniência:Executando
Para executar meu código, tudo o que preciso fazer é selecionar o seguinte código em uma área de trabalho ("playground" no Pharo) ou em qualquer painel de texto e "fazê-lo" no menu de contexto:
O restante do código é relativamente chato.
Como eu disse, há espaço para melhorias, mas a 80x60, cada execução leva mais de 3 minutos na minha máquina. Claramente, o desempenho não tem sido minha preocupação, mas há muitos números primos voando por aí. Isso com certeza tem sido um desafio interessante. :-)
fonte
Javascript, pontuação 659
Quase certamente abaixo do ideal.
Resultados para 30x30:
E para o caso 60x60:
fonte