Le défi
Implémentez le tamis Sundaram pour trouver les nombres premiers ci-dessous n
. Prenez un entier en entrée n
, et sortez les nombres premiers ci-dessous n
. Vous pouvez supposer qu'il n
sera toujours inférieur ou égal à un million.
Tamis
Commencez par une liste des entiers de
1
àn
.Supprimez tous les numéros du formulaire
i + j + 2ij
où:i
etj
sont inférieurs àn
.j
est toujours supérieur ou égal ài
, ce qui est supérieur ou égal à1
.i + j + 2ij
est inférieur ou égal àn
Multipliez les nombres restants par
2
et ajoutez1
.
Cela donnera tous les nombres premiers (sauf ceux 2
qui devraient être inclus dans votre sortie) inférieurs à2n + 2
.
Voici une animation du tamis utilisé pour trouver les nombres premiers ci-dessous 202
.
Production
Votre sortie doit être chaque entier premier ≤ n
(dans l'ordre croissant) suivi d'une nouvelle ligne:
2
3
5
Où n
est 5
.
Exemples
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Les entrées sont désignées par >
.
n=30
manque 29 dans la sortie.(i,j)
qu'aveci<=j
, mais le résultat ne change pas si nous ignorons cette exigence. Pouvons-nous le faire pour économiser des octets?i <= j
. Cela fait juste partie du fonctionnement du tamis. Alors oui, vous pouvez laisser de côté lei <= j
dans votre code. @xnor2n+1
) qui ne sont pas de la forme2(i + j + 2ij)+1
- peut - on tester cette propriété directement sur les nombres premiers potentiels ou ne notre code ont à faire les temps 2 plus 1 à un moment donné ?n
y a dans tout ça. Dans la description de la méthode, il indique qu'il générera tous les nombres premiers jusqu'à2 * n + 2
. Mais dans la description entrée / sortie, il est dit que l'entrée estn
, et la sortie est tout d'abord jusqu'àn
. Sommes-nous donc censés appliquer la méthode pour générer tous les nombres premiers jusqu'à2 * n + 2
, puis supprimer ceux plus grands quen
pour la sortie? Ou devrions-nous calculer lan
dans la description de la méthode à partir de l'entréen
?Réponses:
Pyth, 23 octets
Manifestation
Implémente vraiment l'algorithme comme indiqué.
la source
Haskell,
9390 octetsComment ça marche:
[i+j+2*i*j|j<-r,i<-r]
sont tous ceuxi+j+2ij
qui sont supprimés (\\
) de[1..n]
. Mettez-les à l'échelle2x+1
et transformez-les en chaîne (show
). Rejoignez NL (unlines
).la source
Scala,
115 124 122 122 115114 octetsUne fonction anonyme; prend n comme argument et affiche le résultat sur stdout.
la source
JavaScript (ES7),
107105octetsLa compréhension des tableaux est géniale! Mais je me demande pourquoi JS n'a pas de syntaxe de plage (par exemple
[1..n]
) ...Cela a été testé avec succès dans Firefox 40. Répartition:
Solution alternative compatible ES6 (111 octets):
Suggestions bienvenues!
la source
MATLAB, 98
Et sous une forme lisible
la source
Java8:
168165 octetsPour un nombre plus grand, un type de données avec une large plage peut être utilisé. Nous n'avons pas besoin d'itérer pour des
N
index entiersN/2
sont suffisants.Pour bien comprendre ce qui suit est la méthode équivalente.
la source
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 octets
Essayez-le en ligne
Cela semble un peu long par rapport à la solution Pyth d'isaacg, mais c'est ... ce que j'ai.
Explication:
la source
Perl 6 , 96 octets
Si je suis strictement la description, la plus courte que j'ai réussi à obtenir est de 96 octets.
Si je pouvais faire l'
2n + 1
initialisation du tableau, pré-insérer2
et limiter cela aux seules valeurs inférieures ou égalesn
; il peut être réduit à 84 octets.Si j'ignore également que
j
c'est censé être au moinsi
, je peux le réduire à 82 octets.Exemple d'utilisation:
la source
PHP, 126 octets
Version en ligne
la source
Julia 0,6 , 65 octets
Essayez-le en ligne!
Pas un grand défi en termes de golf, mais je devais juste le faire pour le nom. :)
la source