Trouver des nombres premiers est un rite de programmation de passage et très souvent un premier programme sérieux que quelqu'un crée (généralement avec la division d'essai).
Mais les nombres premiers seuls sont déjà épuisés. Une autre chose beaucoup plus intéressante est d'obtenir les écarts premiers: les écarts les plus longs jusqu'à présent entre des nombres premiers consécutifs. Ce sont assez rares et "précieux". Les premières paires et leurs différences sont:
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...
Mon père les calculait à la main pour s'amuser jusqu'à 10 km. Voyons à quel point un code peut être court.
Règles:
- pas de fonctions intégrées pour les tests principaux, la génération principale ou les écarts principaux
- pas de récupération http://oeis.org/A002386 ou similaire (je peux vous sentir les tricheurs de loin :))
- pas de tableaux précalculés
- continuez à imprimer jusqu'à ce que votre type entier interne échoue sur vous
Le nombre de caractères le plus bas gagne. +10 caractères si vous imprimez uniquement les espaces sans les nombres premiers.
Vous pouvez également montrer des versions avec des fonctions intégrées si elles sont intéressantes. Sois créatif.
Clarification: vous passez par des nombres premiers et vous signalez chaque fois que vous voyez un écart qui est plus grand que tout écart que vous avez vu auparavant. Par exemple, entre 3 et 5, il y a un écart de 2 unités de large. L'écart entre 5 et 7 est également de 2, mais c'est une vieille nouvelle, on s'en fiche plus. Ce n'est que lorsque vous voyez un nouveau plus grand écart, que vous le signalez. Cela reflète la façon dont les nombres premiers deviennent de moins en moins fréquents, alors que les écarts deviennent de plus en plus larges.
EDIT : La plupart des réponses sont brillantes et méritent plus de reconnaissance. Cependant, jusqu'à présent, une entrée GolfScript avec 48 caractères est la plus courte.
Réponses:
GolfScript
6659574948Bien que j'ai du mal à l'exécuter ici http://golfscript.apphb.com/ (peut-être que ce site n'aime pas la boucle infinie?) Mais cela fonctionne très bien lorsque je l'exécute sur mon ordinateur avec golfscript.rb. Je suis assez nouveau sur GolfScript, donc cela peut probablement être approfondi encore plus. MISE À JOUR: Je ne pense pas que cela puisse être approfondi sans changer l'algorithme d'une manière ou d'une autre.
Les premières lignes sont imprimées (si vous n'aimez pas l'impression du "", vous pouvez ajouter; au début du script, mais cela augmente jusqu'à 49 caractères):
Idée générale lisible par l'homme de la façon dont cela fonctionne (quelques choses légèrement différentes puisque je n'utilise pas de pile dans cette version):
la source
Python,
121110109108104103 caractèresLa première fois que j'ai essayé de répondre ici, j'espère que je l'ai bien fait ... pas sûr d'avoir même compté les caractères correctement.
Hmmm, je pourrais enregistrer un autre caractère sur l'impression en rétrogradant en Python 2.x ...
la source
#
, vous ne comptez pas sérieusement les caractères à la main, n'est-ce pas? javascriptkit.com/script/script2/charcount.shtmlif all(n%x>0for x in p):
est un peu plus court. Vous pouvez également enregistrer certains caractères en déplaçant des instructions sur la même ligne (par exemplea=1;b=2;f()
).JavaScript,
90857874 caractèresShort Code (Google Closure Compiler - Optimisations avancées; certaines modifications manuelles; plus de modifications par @ MT0 )
Code long
Production
Test assez inefficace pour les nombres premiers, mais de cette façon, il utilise moins de caractères.
Premier post ici, veuillez donc excuser toute erreur.
la source
for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
Mathematica,
114108Permet une sortie infinie, bien qu'après un certain point de la séquence, le ventilateur tourne et vous commencez à soupçonner que votre CPU joue Freecell tout en faisant de son mieux pour avoir l'air occupé.
Échantillon de sortie (ce sont ceux qu'il prend dans les premières 30 secondes):
Code non golfé:
la source
≠
?Haskell -
122116114112110(Inefficace) expression de liste principale volée à Will Ness .
-edit- je ne savais pas que ce
x|y=z|w=q
serait valide.la source
MATLAB
10489Je viens d'implémenter la méthode de base en vérifiant chaque division possible.
Production:
la source
octave
et cetteinf
chose ne fonctionne pas (et l'impression est différée jusqu'à la fin de la boucle). Matlab a-t-il une évaluation de la plage paresseuse?76 caractères, dogelang
Converti de ma version Python :
Production:
la source
Golfscript,
595150 caractèresHomme, chaque personnage est extrêmement difficile à perdre:
Production :
Explication :
La pile est configurée de sorte que chaque itération commence par la pile comme celle-ci, le haut étant à droite. Le
[
indique le marqueur de tableau actuel, ce qui signifie que lorsque l'interpréteur rencontre a]
, tout sur la pile, de la marque au sommet, est placé dans un tableau.g
est l'écart maximum jusqu'à présent. De haut en bas:À l'intérieur de la boucle:
Comment met-il tous les diviseurs dans une liste? Faisons-le étape par étape
Que fait-il si les diviseurs sont vides?
Deux voies: oui et non. Si oui (notez que
if
consomme la valeur la plus élevée de la pile):Sinon:
Notez dans les deux cas, notre pile est maintenant sous la forme
... | g [ c | c | c
.Maintenant, le
do
saute la valeur supérieure de la pile - toujoursc
- et boucle si elle est positive. Puisquec
toujours en augmentation, cela est toujours vrai, donc nous bouclons pour toujours.Une fois sauté, le haut de la pile est
g [ c | c
, ce qui signifie que le dernier a été mis à jourc
, la marque du tableau est au même endroit etg
est toujours là où nous l'attendons.Ce sont les opérations alambiquées de GolfScript. J'espère que vous avez aimé suivre!
la source
Rubis, 110
Uniquement pour Ruby 2.0 en raison de la
lazy
méthode:Production:
la source
Perl, 105 octets
Non golfé:
L'algorithme est simple, se
$p
souvient du nombre premier précédent. Passe ensuite$i
de3
à, lorsque le type $ i "échoue sur moi" ou devient négatif à cause d'un débordement.$i
est testé de manière grossière en vérifiant tous les diviseurs de 2 à$i-1
. Une ligne est imprimée si la différence actuelle est supérieure à la différence imprimée précédente$d
.Avec quelques octets supplémentaires, le temps d'exécution peut être amélioré:
Le résultat commence par:
la source
Python,
9391 caractèresVérification principale naïve (vérifier si divisible par quoi que ce soit de 2 à
n
(moins de caractères que àn/2
)):Le deuxième niveau de retrait est un caractère de tabulation.
Production:
la source
n
seulement les contrôles jusqu'àn-1
Bash et Perl pour certains premier regex (
167 157 143112 octets)une sortie:
la source
test
je proteste beaucoup et cela ne fonctionne pas pour moi. Vous pouvez également utiliser certainslet n++
etlet f=c-p
et remplacertest
par[
. Ou peut-être tester(())
là où vous n'avez pas besoin$
ni d'espace.test -n $d
retourné vrai pour une chaîne vide.test -n "$d"
était bien mais plus long. Cependant, la page de manuel indique que -n est facultatif, et iltest $d
s'est avéré que c'était ok. Et donc[ $d ]
aussi. Et g = 0 devait être initialisé.Perl
9590 octetsancienne version non golf:
Ceci est similaire à mon autre soumission, sans bash.
la source
for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
C (100)
Ma propre contribution, pas d'algorithme spécial, juste du golf:
la source
r
etp
vous aurez moins de caractères etHaskell, 134C
Golfé:
Non golfé:
la source
C:
493302272246J'ai utilisé la récursion pas la boucle habituelle de
for
ouwhile
.Production:
la source
leaking
en haut, parce que vous ne testez pas isPrime (n2), vous laissez des nombres premiers entre n1 et n2. Et cela ne peut pas vraiment être corrigé, car vous ne pouvez pas augmenter n2 sans rencontrer des nombres premiers.return
en principal. Sautez le dernierelse
. Remplacez&&
->&
etnum%i==0
parnum%i<1
. Et selon les anciennes normes c (il y aura des avertissements), vous n'avez pas besoin de spécifier des valeurs de retour pour les fonctions void et int (leurs arguments par défaut sont également int).int
) et une fonction de test principale très réduite:e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
Oracle SQL,
216202196172 172 + 10 = 182Je viens de remarquer cela dans la question:
Comme il s'agit de SQL et que les mots clés sont si longs, il est préférable de prendre la pénalité, en donnant ce qui suit. C'est la même idée que l'original.
ce qui donne:
Ancienne réponse (196)
et dans un format lisible:
Cela crée un générateur de nombres dans
c
, la sous-sélection la plus intérieure crée les nombres premiers à l'aide d'un tamis d'Ératosthène, l'extérieur détermine le premier précédent et enfin le dernier choix soustrait l'un de l'autre.Cela ne retournera rien car il exécute 1 x 10 124 requêtes récursives ... Donc, si vous voulez que cela fonctionne, diminuez ce nombre à quelque chose de sensé.
la source
D - 153 + 10 = 163
Je prends volontiers la pénalité de +10 ici, car le nombre de caractères est toujours inférieur à ce qu'il aurait été si j'avais également imprimé les nombres premiers.
Golfé :
Version lisible :
la source
JAVASCRIPT 174 char
version courte:
la source
Javascript 138
Copiez ce code sur la console de votre navigateur. Ce sera pour toujours comme le nombre maximum est quelque chose autour
1.79*10^308
.Non golfé:
la source
C #
162161 caractères151 caractères + 10 caractères de pénalité = 161 caractères
Version courte:
Version longue:
Il était en fait préférable de prendre une pénalité de 10 caractères, car l'écriture est plus courte
g
(11 caractères avec pénalité) quep+" "+i+" "+g
(13 caractères sans pénalité).la source
Ruby
90868483 caractèresQuelques courts-circuits booléens, évaluation d'abus d'expression, etc.
la source
C 248
Le code compare les nombres premiers consécutifs a, b, puis vérifie si les écarts sont plus grands que g, puis trouve la paire suivante de nombres premiers.
la source
Haskell,
154 144 137123Les nombres premiers
p
sont générés à l'aide du tamis des gommes à effacer#
, puis filtrés et imprimés à l'aide de%
.La sortie ressemble à
j'espère que ça va.
la source
Langue de Game Maker, 85
En supposant que toutes les variables non initialisées sont
0
(c'est la valeur par défaut avec certaines versions de Game Maker).la source
Langue Game Maker, 74 + 55 = 129
En supposant que toutes les variables non initialisées sont
0
(c'est la valeur par défaut avec certaines versions de Game Maker).Le script
p
est ci-dessous:la source
Perl, 87 octets (à l' aide d'un module )
J'ai écrit le module, mais il faudrait ajouter 565 000 caractères supplémentaires au décompte. Publier principalement pour le plaisir, mais aussi pour offrir une alternative de performance, car je n'en vois pas jusqu'à présent utiliser des intégrés. 4,6 s pour les écarts à 1e9, 36s pour les écarts à 1e10, 6,5 min pour 1e11.
Pari / GP 2.8 peut être fait essentiellement de la même manière, quoique plus de 2 fois plus lentement:
la source
Perl 153
Petit code:
facile à lire:
la source