O desafio
Implemente a peneira Sundaram para encontrar os números primos abaixo n
. Pegue um número inteiro de entrada n
e dê os números primos abaixo n
. Você pode assumir que n
sempre será menor ou igual a um milhão.
Peneira
Comece com uma lista dos números inteiros de
1
atén
.Remova todos os números que estão no formulário em
i + j + 2ij
que:i
ej
são menores quen
.j
é sempre maior que ou igual ai
, que é maior que ou igual a1
.i + j + 2ij
é menor ou igual an
Multiplique os números restantes por
2
e adicione1
.
Isso produzirá todos os números primos (exceto os 2
que devem ser incluídos na sua saída) inferiores a 2n + 2
.
Aqui está uma animação da peneira usada para encontrar os números primos abaixo 202
.
Resultado
Sua saída deve ser todo número inteiro primo ≤ n
(em ordem crescente) seguido por uma nova linha:
2
3
5
Onde n
é 5
.
Exemplos
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
As entradas são indicadas por >
.
n=30
está faltando 29 na saída.(i,j)
comi<=j
, mas o resultado não muda se ignorarmos esse requisito. Podemos fazer isso para salvar bytes?i <= j
. É apenas parte de como a peneira funciona. Então, sim, você pode deixar de fora oi <= j
código. @xnor2n+1
) que não são da forma2(i + j + 2ij)+1
- podemos testar essa propriedade diretamente nos primos em potencial ou nosso código precisa fazer os tempos 2 mais 1 em algum momento ?n
está na coisa toda. Na descrição do método, ele diz que irá gerar todos os números primos até2 * n + 2
. Mas na descrição de entrada / saída, diz que a entrada én
e a saída é iniciada atén
. Então, devemos aplicar o método para gerar todos os números primos até2 * n + 2
, e depois largar os que forem maiores do quen
para a saída? Ou devemos calcular an
descrição do método a partir da entradan
?Respostas:
Pitão, 23 bytes
Demonstração
Realmente apenas implementa o algoritmo como dado.
fonte
Haskell,
9390 bytesComo funciona:
[i+j+2*i*j|j<-r,i<-r]
são todos osi+j+2ij
quais são removidos (\\
) de[1..n]
. Dimensione2x+1
e transforme-os em uma string (show
). Junte-se a NL (unlines
).fonte
Scala,
115 124 122 115114 bytesUma função anônima; toma n como argumento e imprime o resultado em stdout.
fonte
JavaScript (ES7),
107105 bytesCompreensões de matriz são impressionantes! Mas eu me pergunto por que JS não tem sintaxe de alcance (por exemplo
[1..n]
) ...Isso foi testado com sucesso no Firefox 40. Avaria:
Solução alternativa compatível com ES6 (111 bytes):
Sugestões são bem-vindas!
fonte
MATLAB, 98
E de forma legível
fonte
Java8:
168165 bytesPara um número maior, é possível usar o tipo de dados com ampla faixa. Não precisamos iterar, pois
N
índices inteirosN/2
são suficientes.Entender adequadamente o seguinte é o método equivalente.
fonte
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 bytes
Experimente online
Isso parece um pouco demorado em relação à solução Pyth de isaacg, mas é ... o que eu tenho.
Explicação:
fonte
Perl 6 , 96 bytes
Se eu seguir rigorosamente a descrição, o menor que consegui obter será de 96 bytes.
Se eu pudesse fazer a
2n + 1
inicialização da matriz, inserindo2
e limitando isso apenas aos valores menores ou iguais an
; pode ser reduzido para 84 bytes.Se eu também ignorar o que
j
deveria ser pelo menosi
, posso reduzi-lo para 82 bytes.Exemplo de uso:
fonte
PHP, 126 bytes
Versão Online
fonte
Julia 0.6 , 65 bytes
Experimente online!
Não é um grande desafio em termos de golfe, mas eu apenas tive que fazê-lo pelo nome. :)
fonte