Deux nombres premiers sont définis comme des nombres premiers jumeaux s'ils diffèrent par deux. Par exemple, 3 et 5 sont des nombres premiers jumeaux, tout comme 29 et 31.
Écrivez un programme qui trouve la nième paire de nombres premiers jumeaux (d'où n vient de STDIN) et les imprime sur STDOUT, séparés par une virgule et un espace. C'est le code-golf, donc le code le plus court l'emporte.
Exemple d'entrée:
3
Exemple de sortie:
11, 13
Réponses:
Haskell 118
Brute-force tous les nombres premiers jumeaux et imprime la n ème paire.
la source
interact
place deputStrLn
vous pouvez aller encore plus loin et ramener cela à 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 octetsEssayez-le en ligne.
Exemples
Comment ça marche
la source
Perl,
1018787 caractères, construisant sur le commentaire d'un aspirateur
101 caractères, réponse antérieure
Usage:
Explication
Le fonctionnement du regex de non-primalité est expliqué dans cette question SO .
la source
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Exemple d'exécution:
Merci pour l'aide de Dennis, bebe et Alchymist.
la source
scanf
place des arguments de ligne de commande. Aussi,o=0
est inutile, caro
est global.main
pourrait contenir une variable int par défaut, l'incrémentationc
eti
entre les affectations et les instructions pourrait raccourcir le code, l'affectation del
pourrait être ramenée au premier pour le troisième bloc de la boucle afin que vous n'ayez pas besoin d'accolades et que l'utilisation d'un seul caractère de séparateur dans printf puisse définitivement le rendre plus compact.c<=i-1
, ce qui est tout simplement idiot.i
dans l'l
expression d'affectation, car la (nouvelle) valeur dei
est utilisée pour décrémentern
. Des conseils?CJam - 26
Cela fonctionne pour des nombres premiers inférieurs à 10000; vous pouvez remplacer
4
par un exposant plus élevé pour les plus grands nombres (potentiellement jusqu'à 10 20 ), mais le programme deviendra plus lent et utilisera plus de mémoire.Essayez-le sur http://cjam.aditsu.net/
Explication:
1e4,
crée le tableau [0 1 2 ... 9999]{mp},
sélectionne uniquement les nombres premiers_2f-
copie le tableau et soustrait 2 de chaque élément&
intersecte les deux tableaux, trouvant ainsi les nombres premiers inférieurs de chaque paire principale jumelleqi
lit l'entrée et convertit en entier(=
ajuste le index et obtient le nombre premier (inférieur) correspondant du tableau_2+
copie le nombre premier et ajoute 2", "\
place la virgule et l'espace entre les deux nombres premiersla source
Mathematica - 63 caractères
Remarques
Il s'agit en fait d'une mise en œuvre plutôt simple. Le raccourcissement n'a entraîné pratiquement aucune obfuscation.
NextPrime
est une fonction intégrée qui trouve le premier nombre premier après un nombre.NestWhile[NextPrime,#,#2-#1!=2&,2]&
est une fonction anonyme qui trouve le plus grand nombre premier de la paire de paires jumelles suivante après un nombre.Nest
applique cette fonction anonymen
fois.Print[#-2,", ",#]&
est une fonction anonyme qui imprime sur stdout selon les spécifications. Malheureusement, cela à lui seul occupe 18 caractères de la solution à 63 caractères.Exemple
Mise à jour: Deux caractères pourraient être enregistrés en réimplémentant cette solution CJam . Cependant, cet algorithme limite la valeur maximale de
n
. Remplacez simplement laNest...
pièce parIntersection[#,#-2][[5]]&@Prime@Range[999]
la source
Javascript (E6) 92
96Plus court et conforme - utilisez le shell spidermonkey pour lire stdin / écrire stdout (avec virgule et espace). Il trouve la 10000e paire 1260989, 1260991 en moins d'une minute sur mon PC. Il
pourrait être plus court à utiliser à la
p[n]=o=n
place dep.push(o=n)
, de sorte que la matrice p est rare. Mais c'est assez lent, et je ne gagnerai pas de toute façon pour la longueur du code.Pour essayer dans la console Firefox:
Non golfé
Une fonction qui a trouvé tous les m premiers jumeaux (renvoie la plus grande valeur):
Exemple:
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]
Juste la dernière:
Ensuite, prenez ces 2 lignes et ajoutez IO
la source
J -
49 60 5551 octetsJ'ai décidé de suivre une approche simple. La fonction
t
trouve le premier jumeau suivant en fonction d' un nombre premier en entrée (maintenant, cela est inclus dans laf
fonction). La fonctionf
trouve le nième nombre premier. C'est aussi le premier programme réel que j'ai écrit en J.Exemples:
Juste pour quelques sourcils, ayez la version non golfée.
Explication:
la source
C #, 265
la source
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
place deProgram
et le paramètre à laa
place deargs
.)
après le.Count(...)<3
. Vous pouvez également économiser un peu en passantvar i=int.Parse(args[0]);int f=0,c=0;
àint i=int.Parse(args[0]),f=0,c=0;
. Vous pouvez en sauvegarder davantage en extrayant l'initialiseur de la boucle, doncc=0;for(int j=1;
=>c=0,j=1;for(;
.for
boucle, plus en utilisant un nom complet plutôt queusing 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 caractères.Rubis 94
Test en ligne: http://ideone.com/B2wxnG
la source
Perl,
10095Non golfé:
la source
T-SQL (2008+): 344
Brute force un CTE à trouver des nombres premiers, une fonction de fenêtre à compter n, suivie d'une jointure pour trouver le jumeau. Fonctionne en une seconde pour les sorties <1 000, un peu moins d'une minute pour les sorties <10 000.
Golfé (SQLFiddle ici ):
Lisible:
la source
GolfScript 46
Test en ligne: lien
Code annoté:
la source
PHP 5.4, 223
Pas un plus petit, mais un essai de php.
la source
C 309
Continue d'obtenir les nombres premiers suivants et stocke les termes pairs et impairs, puis vérifie si la différence est de deux.
la source
for (int i=2;i*i<=k;i++)
R, 91 caractères
Rien d'extraordinaire:
Usage:
la source
Japt,
2319 octets-4 octets grâce à Shaggy
Exécutez-le en ligne
la source
JavaScript (Node.js), 162 caractères
Lit depuis stdin, sort vers stdout, quitte "tôt" pour l'entrée
<= 0
.Utilisation (script ci-dessus enregistré sous
ntp.js
):la source
AWK - 129
Le dossier
fsoe-pairs.awk
:Exécuter:
(1ère ligne après l'entrée de la commande, la 2ème sortie)
Ceci est basé sur un propre algorithme de générateur principal que j'appelle "tamis flottant d'érastosthènes" (jusqu'à ce que je le trouve décrit ailleurs) qui ne stocke que la partie nécessaire du tamis et les nombres premiers déjà calculés.
la source
Python 2 (75)
Alors qu'est-ce qui se passe ici?
Tout d'abord, regardons l'expression
all(n%i&~2for i in range(2,n-2))
, qui vérifie s'il(n-2,n)
s'agit d'une paire de nombres premiers jumeaux.L'expression plus
all(n%i for i in range(2,n))
simple vérifie simplement sin
est premier en essayant tous les diviseursi
de la plage2<=i<=n-1
et en voyant si tous les restes sont différents de zéro. Celaall
vérifie exactement cela, car Python traite0
commeFalse
et tous les autres nombres commeTrue
.Maintenant, observez cela
(n-2)%i==0
exactementn%i==2
pour les diviseursi>2
. Ainsi, nous pouvons effectuer le contrôle de primalité surn
etn-2
en même temps en vérifiant les restes pour0
et2
. Cela pourrait se faire commeall(n%i not in [0,2] for i in range(2,n-2))
. Nous essayons uniquement les diviseurs de la gamme2<=i<=n-3
pour le plaisir den-2
, mais cela suffitn
aussi depuisn-1
etn-2
ne peut pas être des diviseurs à moinsn<=4
. Nous n'essaierons que de bizarre àn
partir de5
pour éviter cette complication et celle du diviseuri=2
.Nous jouons l'expression
n%i not in [0,2]
en nousn%i&~2
souvenant que0
c'est faux et que d'autres chiffres le sontTrue
. La priorité de l'opérateur(n%i)&(~2)
est exactement ce qui est nécessaire. Le complément de bits~2
est...11111101
, donc son bitand
avec un nombre met à zéro la2
valeur de position binaire de. Cela donne0
(c'est-à-direFalse
) uniquement pour0
et2
exactement ce que nous voulons.Phew! Maintenant, nous avons que l'expression
all(n%i&~2for i in range(2,n-2))
vérifie sin
est le nombre supérieur d'une paire principale jumelle. Il reste à les parcourir jusqu'à ce que nous les voyionsc
, oùc
est le nombre entré. Nous commençons par5
et comptons2
pour éviter les problèmes de diviseurs. Nous décrémentonsc
chaque fois que nous rencontrons unn
qui fonctionne, s'arrêtant quandc=0
. Enfin, nous imprimons la paire prime jumelle avec laquelle nous terminons.la source
T-SQL (2012 +), 255 caractères
Un Twin Prime Finder T-SQL plus compact qui obtient également un peu d'accélération.
Format lisible par l'homme ::
L'essentiel de base est que nous utilisons la table de nombres intégrée (master..spt_values type = 'p') et l'alias avec un CTE comme quelque chose de court. Nous ajoutons 2 pour supprimer le souci de tirer 0 ou 1 erreurs triviales pour notre ensemble, nous avons donc maintenant des candidats de 2,2050.
Z la requête la plus interne obtient tous les nombres premiers de 2 à 2050, en filtrant tout nombre n divisible par un nombre inférieur à n. Nous utilisons ensuite une fonction de fenêtrage astucieuse T-SQL 2012
lag
qui nous permet de tirer le résultat précédent, alors maintenant les résultats de Z a et b sont les nombres premiersP[n]
etP[n-1]
respectivement. La requête R crée la chaîne de sortie, filtre les nombres premiers non jumeaux et crée également un numéro de séquence pour la sortie que nous appelons K. Enfin, la dernière requête R nous permet de filtrer et d'obtenir le Kth twin prime en changeant sa variable.la source
Mathematica - 71 octets
la source