Dos números primos se definen como primos gemelos si difieren en dos. Por ejemplo, 3 y 5 son primos gemelos al igual que 29 y 31.
Escriba un programa que encuentre el enésimo par de primos gemelos (donde n proviene de STDIN) y los imprima en STDOUT, separados por una coma y un espacio. Este es el código de golf, por lo que gana el código más corto.
Entrada de muestra:
3
Salida de muestra:
11, 13
Respuestas:
Haskell 118
Fuerza bruta todos los primos gemelos e imprime el enésimo par.
fuente
interact
lugar deputStrLn
usted, puede ir aún más lejos y reducir esto a 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 bytesPruébalo en línea.
Ejemplos
Cómo funciona
fuente
Perl,
1018787 caracteres, construidos sobre el comentario de aschepler
101 caracteres, respuesta anterior
Uso:
Explicación
El funcionamiento de la expresión regular de no primalidad se explica en esta pregunta SO .
fuente
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Ejecución de muestra:
Gracias por la ayuda de Dennis, Bebe y Alchymist.
fuente
scanf
lugar de argumentos de línea de comandos. Además,o=0
es innecesario, ya queo
es global.main
podría contener una variable int predeterminada, incrementarc
yi
entre asignaciones y declaraciones podría acortar el código, la asignación del
podría volver al primer bloque del tercer bloque del bucle, por lo que no necesitaría llaves y usar solo un carácter de separador en printf definitivamente podría Hazlo más compacto.c<=i-1
, lo cual es una tontería.i
lal
expresión de asignación, ya que el (nuevo) valor dei
se usa para disminuirn
. ¿Algun consejo?CJam - 26
Funciona para primos menores de 10000; puede reemplazar
4
con un exponente más alto para números más grandes (potencialmente hasta 10 20 ), pero el programa se volverá más lento y usará más memoria.Pruébalo en http://cjam.aditsu.net/
Explicación:
1e4,
crea la matriz [0 1 2 ... 9999]{mp},
selecciona sólo los números primos_2f-
copias de la matriz y resta 2 de cada elemento&
se cruza las dos matrices, encontrando así los números primos inferiores de cada gemelo par primeqi
lee la entrada y la convierte a número entero(=
ajusta la indexa y obtiene el primo gemelo correspondiente (inferior) de la matriz_2+
copia el primo y agrega 2", "\
pone la coma y el espacio entre los dos primosfuente
Mathematica - 63 caracteres
Notas
De hecho, esta es una implementación bastante sencilla. El acortamiento resultó en casi ninguna ofuscación.
NextPrime
es una construcción que encuentra el siguiente primo después de un número.NestWhile[NextPrime,#,#2-#1!=2&,2]&
es una función anónima que encuentra el primo más grande del siguiente par de primos gemelos después de un número.Nest
aplica esta función anóniman
veces.Print[#-2,", ",#]&
es una función anónima que imprime en stdout de acuerdo con las especificaciones. Lamentablemente, esto solo ocupa 18 caracteres de la solución de 63 caracteres.Ejemplo
Actualización: se pueden guardar dos caracteres reimplementando esta solución CJam . Sin embargo, este algoritmo limita el valor máximo de
n
. Simplemente reemplace laNest...
parte porIntersection[#,#-2][[5]]&@Prime@Range[999]
fuente
Javascript (E6) 92
96Más corto y compatible: use el spidermonkey shell para leer stdin / escribir stdout (con coma y espacio). Encuentra el par 10000º 1260989, 1260991 en menos de un minuto en mi PC.
Podría ser más corto usando en
p[n]=o=n
lugar dep.push(o=n)
, por lo que la matriz p es escasa. Pero eso es bastante más lento, y de todos modos no voy a ganar por la longitud del código.Para probar en la consola de Firefox:
Sin golf
Una función que encontró todos los primeros m gemelos (devuelve el valor más grande):
Ejemplo:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Solo el último:
Luego, toma esas 2 líneas y agrega IO
fuente
J -
49 60 5551 bytesDecidí ir con un enfoque simple. La función
t
encuentra el próximo primo gemelo dado un número primo como entrada (ahora esto está incluido en laf
función). La funciónf
encuentra el enésimo gemelo primo. Este también es el primer programa real que escribí en J.Ejemplos:
Solo para algunas cejas, tenga la versión sin golf.
Explicación:
fuente
C #, 265
fuente
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
lugar deProgram
y el parámetro ena
lugar deargs
.)
después del.Count(...)<3
. También puede ahorrar un poco cambiandovar i=int.Parse(args[0]);int f=0,c=0;
aint i=int.Parse(args[0]),f=0,c=0;
. Puede guardar algo más extrayendo el inicializador del bucle, entoncesc=0;for(int j=1;
=>c=0,j=1;for(;
.for
bucle, además de usar un nombre completo en lugar deusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
238 caracteres.Rubí 94
Prueba en línea: http://ideone.com/B2wxnG
fuente
Perl,
10095Sin golf:
fuente
T-SQL (2008+): 344
Bruto obliga a un CTE a encontrar números primos, la función de ventana para contar n, seguido de una unión para encontrar el gemelo. Funciona en un segundo para salidas <1,000, poco menos de un minuto para salidas <10,000.
Golfed (SQLFiddle aquí ):
Legible:
fuente
GolfScript 46
Prueba en línea: enlace
Código anotado:
fuente
PHP 5.4, 223
No una más pequeña, pero una prueba de php.
fuente
C 309
Sigue obteniendo los siguientes números primos y almacena términos pares e impares, luego verifica si la diferencia es dos.
fuente
for (int i=2;i*i<=k;i++)
R, 91 caracteres
Nada realmente elegante:
Uso:
fuente
Japt,
2319 bytes-4 bytes gracias a Shaggy
Ejecútalo en línea
fuente
JavaScript (Node.js), 162 caracteres
Lee desde stdin, sale a stdout, sale "temprano" para la entrada
<= 0
.Uso (script anterior guardado como
ntp.js
):fuente
AWK - 129
El archivo
fsoe-pairs.awk
:Ejecutándolo:
(1ra línea después de ingresar el comando, la 2da sale)
Esto se basa en un algoritmo generador propio principal que llamo "tamiz flotante de erastóstenes" (hasta que lo encuentre descrito en otra parte) que solo almacena la parte necesaria del tamiz y los primos ya calculados.
fuente
Pitón 2 (75)
Entonces, ¿qué está pasando aquí?
Primero, veamos la expresión
all(n%i&~2for i in range(2,n-2))
, que verifica si(n-2,n)
hay un par de primos gemelos.La expresión más simple
all(n%i for i in range(2,n))
simplemente comprueba sin
es primo probando cada divisori
en el rango2<=i<=n-1
y viendo si todos los restos son distintos de cero. Estoall
verifica exactamente esto, ya que Python trata0
comoFalse
y todos los demás números comoTrue
.Ahora, observe eso
(n-2)%i==0
exactamente cuandon%i==2
para divisoresi>2
. Por lo tanto, podemos realizar la verificación de primalidadn
yn-2
al mismo tiempo verificando los restos para ambos0
y2
. Esto podría hacerse comoall(n%i not in [0,2] for i in range(2,n-2))
. Solo intentamos divisores en el rango2<=i<=n-3
por el bien den-2
, pero esto también es suficienten
desde entoncesn-1
yn-2
no puede ser divisores a menos quen<=4
. Solo trataremos den
comenzar de manera extraña5
para evitar esta complicación y la del divisori=2
.Desarrollamos la expresión
n%i not in [0,2]
enn%i&~2
, recordando que0
es Falso y otros números sonTrue
. La precedencia del operador(n%i)&(~2)
es exactamente lo que se necesita. El complemento de bits~2
es...11111101
, por lo que es bitand
a bit con un número que pone a cero el2
valor posicional binario. Esto da0
(es decir,False
) solo para0
y2
, exactamente lo que queremos.¡Uf! Ahora tenemos que la expresión
all(n%i&~2for i in range(2,n-2))
verifica sin
es el número superior de un par primo gemelo. Lo que queda es iterar sobre ellos hasta que los veamosc
, dondec
está el número ingresado. Comenzamos con5
y contando2
para evitar problemas de divisores. Disminuimosc
cada vez que nos encontramos con algon
que funciona, deteniéndonos cuandoc=0
. Finalmente, imprimimos el primer par gemelo que terminamos.fuente
T-SQL (2012 +), 255 caracteres
Un buscador de primos gemelos T-SQL más compacto que también se acelera un poco.
Formato legible por humanos ::
La esencia básica es que usamos la tabla de números incorporada (master..spt_values type = 'p') y alias que con un CTE como algo corto. Agregamos 2 para eliminar la preocupación de extraer 0 o 1 errores triviales para nuestro conjunto, por lo que ahora tenemos candidatos de 2,2050.
Z, la consulta más interna obtiene todos los números primos del 2 al 2050, al filtrar cualquier número n que sea divisible por un número menor que n. Luego usamos una ingeniosa función de ventanas T-SQL 2012
lag
que nos permite extraer el resultado anterior, por lo que ahora los resultados de Z ayb son los primosP[n]
yP[n-1]
respectivamente. La consulta R crea la cadena de salida y filtra primos no gemelos y también crea un número de secuencia para la salida que llamamos K. Finalmente, la última consulta R nos permite filtrar y obtener el primo gemelo Kth cambiando su variable.fuente
Mathematica - 71 bytes
fuente