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 nsiempre será menor o igual a un millón.
Tamiz
Comience con una lista de los enteros de
1an.Elimine todos los números que están en la forma
i + j + 2ijdonde:iyjson menos quen.jsiempre es mayor o igual quei, que es mayor o igual que1.
i + j + 2ijes menor o igual quen
Multiplica los números restantes por
2y 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 nes 5.
Ejemplos
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Las entradas se denotan por >.

n=30falta 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 <= jen 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? ?nhay 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 + 2y luego eliminar los más grandes quenpara la salida? ¿O deberíamos calcularnen 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+2ijque se eliminan (\\) de[1..n]. Escale2x+1y 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/2es 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 + 1inicialización de la matriz, pre-insertar2y limitar eso solo a los valores menores o iguales an; Se puede reducir a 84 bytes.Si también ignoro que
jse 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