El reto
Implemente el tamiz Sundaram para encontrar los números primos a continuación n
. Tome un entero de entrada n
, y envíe los números primos a continuación n
. Puede suponer que n
siempre será menor o igual a un millón.
Tamiz
Comience con una lista de los enteros de
1
an
.Elimine todos los números que están en la forma
i + j + 2ij
donde:i
yj
son menos quen
.j
siempre es mayor o igual quei
, que es mayor o igual que1
.i + j + 2ij
es menor o igual quen
Multiplica los números restantes por
2
y suma1
.
Esto producirá todos los números primos (excepto 2
, que deben incluirse en su salida) menos que 2n + 2
.
Aquí hay una animación del tamiz que se usa para encontrar primos a continuación 202
.
Salida
Su salida debe ser cada número entero primo ≤ n
(en orden ascendente) seguido de una nueva línea:
2
3
5
Donde n
es 5
.
Ejemplos
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Las entradas se denotan por >
.
n=30
falta 29 en la salida.(i,j)
coni<=j
, pero el resultado no cambia si ignoramos este requisito. ¿Podemos hacerlo para guardar bytes?i <= j
. Es solo parte de cómo funciona el tamiz. Entonces sí, puede omitir eli <= j
en su código. @xnor2n+1
) que no son de la forma2(i + j + 2ij)+1
: ¿podemos probar esta propiedad directamente en los números primos potenciales o nuestro código tiene que hacer los tiempos 2 más 1 en algún momento? ?n
hay en todo el asunto. En la descripción del método, dice que generará todos los primos hasta2 * n + 2
. Pero en la descripción de entrada / salida, dice que la entrada esn
, y la salida se prepara hastan
. Entonces, ¿se supone que debemos aplicar el método para generar todos los primos2 * n + 2
y luego eliminar los más grandes quen
para la salida? ¿O deberíamos calcularn
en la descripción del método a partir de la entradan
?Respuestas:
Pyth, 23 bytes
Demostración
Realmente solo implementa el algoritmo como se indica.
fuente
Haskell,
9390 bytesCómo funciona:
[i+j+2*i*j|j<-r,i<-r]
son todos losi+j+2ij
que se eliminan (\\
) de[1..n]
. Escale2x+1
y conviértalos en una cadena (show
). Únete con NL (unlines
).fuente
Scala,
115 124 122 115114 bytesUna función anónima; toma n como argumento e imprime el resultado en stdout.
fuente
JavaScript (ES7),
107105 bytes¡Las comprensiones de matriz son increíbles! Pero me pregunto por qué JS no tiene sintaxis de rango (por ejemplo
[1..n]
) ...Esto se probó con éxito en Firefox 40. Desglose:
Solución alternativa, compatible con ES6 (111 bytes):
Sugerencias bienvenidas!
fuente
MATLAB, 98
Y en una forma legible
fuente
Java8:
168165 bytesPara números más grandes, se puede utilizar el tipo de datos con amplio rango. No necesitamos iterar para
N
índices completosN/2
es suficiente.Para entender correctamente el siguiente es el método equivalente.
fuente
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 bytes
Pruébalo en línea
Esto parece algo largo en relación con la solución Pyth de Isaac, pero es ... lo que tengo.
Explicación:
fuente
Perl 6 , 96 bytes
Si sigo estrictamente la descripción, el más corto que logré obtener es de 96 bytes.
Si pudiera hacer la
2n + 1
inicialización de la matriz, pre-insertar2
y limitar eso solo a los valores menores o iguales an
; Se puede reducir a 84 bytes.Si también ignoro que
j
se supone que es al menosi
, puedo reducirlo a 82 bytes.Ejemplo de uso:
fuente
PHP, 126 bytes
Versión en línea
fuente
Julia 0.6 , 65 bytes
Pruébalo en línea!
No es un gran desafío en términos de golf, pero solo tuve que hacerlo por el nombre. :)
fuente