introduction
La fonction de comptage de nombres premiers , également connue sous le nom de fonction Pi , renvoie la quantité de nombres premiers inférieure ou égale à x.
Défi
Votre programme prendra un entier x que vous pouvez supposer positif et produira un seul entier égal au nombre de nombres premiers inférieur ou égal à x. Il s'agit d'un défi de code-golf , donc le gagnant sera le programme avec le moins d'octets.
Vous pouvez utiliser n'importe quelle langue de votre choix à condition qu'elle existait avant que ce défi ne soit relevé, mais si la langue a une fonction de comptage de prime intégrée ou une fonction de vérification de primalité (telle que Mathematica), cette fonction ne peut pas être utilisée dans votre code .
Exemples d'entrées
Entrée:
1
Sortie:
0
Entrée:
2
Sortie:
1
Entrée:
5
Sortie:
3
Réponses:
05AB1E , 3 octets
Cela suppose que les fonctions intégrées de factorisation sont autorisées. Essayez-le en ligne!
Comment ça marche
la source
Python 2, 45 octets
Utilise le générateur principal du théorème de Wilson . Le produit
p
suit(k-1)!^2
, etp%k
est 1 pour les nombres premiers et 0 pour les nonprimes.la source
MATL ,
11, 10, 8, 5 octetsEssayez-le en ligne!
J'ai écrit une version qui avait une explication vraiment cool du fonctionnement des matrices MATL:
:YF!s1=1
Mais ce n'est plus pertinent. Consultez l'historique des révisions si vous voulez le voir.
Nouvelle explication:
Trois octets économisés grâce à la solution géniale de Dennis
la source
YF!s1=s
Gelée ,
85 octets3 octets économisés grâce à @Dennis!
Essayez-le en ligne!
Port de la réponse MATL de DJMcMayhem (ancienne version) affinée par Dennis.
la source
ÆE
, car chaque exposant correspond à un facteur premier différent.RÆESL
atteint exactement cela.!ÆEL
serait encore plus court.Modèles MediaWiki avec ParserFunctions , 220 + 19 = 239 octets
Pour appeler le modèle:
Arrangé dans le style Lisp:
Juste un test de primalité basique de 2 à n . Les nombres avec trois accolades autour d'eux sont les variables, où
{{{1}}}
est n ,{{{2}}}
est le nombre testé,{{{3}}}
est le facteur à vérifier.la source
Perl, 33 octets
Comprend +1 pour
-p
Donnez le numéro d'entrée sur STDIN
primecount.pl
Donne le mauvais résultat
0
mais c'est OK, l'op a demandé le support des entiers positifs uniquement.la source
Rétine, 31 octets
Le nombre d'octets suppose un codage ISO 8859-1. Convertissez l'entrée en unaire, générez la plage de
1
àn
, chacune sur sa propre ligne. Faites correspondre les nombres premiers.Essayez-le en ligne - L'entrée est beaucoup plus grande que 2800 soit expire soit manque de mémoire.
Les références:
Générateur de gamme Martin
Premier vérificateur de Martin
la source
Gelée , 3 octets
Essayez-le en ligne!
Comment ça marche
la source
Gelée ,
13 11 10 9 8 76 octetsUtiliser aucune fonction principale intégrée de quelque
nature que ce soit -1 octet grâce à @miles (utiliser une table)
-1 octet grâce à @Dennis (convertir de unaire pour compter les diviseurs)
TryItOnline
Ou consultez les 100 premiers termes de la série
n=[1,100]
, également sur TryItOnlineComment?
la source
%þ`¬Sċ2
utilisant une table de restes.ḍþḅ1ċ2
enregistre un octet.JavaScript (ES6),
4543 octetsUne modification de ma fonction de primalité
363533 octets (1 octet enregistré par @Neil, 2 par @Arnauld):(Je ne peux pas poster ceci n'importe où parce que ce nombre est un nombre premier? Accepte uniquement les programmes complets ...)
Extrait de test
Afficher l'extrait de code
la source
&
au milieu de votre fonction de primalité.PowerShell v2 +, 98 octets
Attention: Ceci est lent pour une entrée volumineuse.
Fondamentalement, la recherche unaire de Is this number a prime? , couplé à une
for
boucle et un$j++
compteur. Un peu de logique supplémentaire sur le devant pour tenir compte de l'entrée des cas de bord1
et2
, en raison de la façon dont le clôtureposting fonctionne dans lesfor
boucles.la source
05AB1E , 5 octets
Suppose que les fonctions intégrées de factorisation principale sont autorisées.
Code:
Explication:
Utilise l' encodage CP-1252 . Essayez-le en ligne!
la source
ÅPg
est ce que ce serait maintenant, non?CJam , 7 octets
Essayez-le en ligne! Utilise une fonction de factorisation.
Explication:
la source
Gelée , 6 octets
Cela utilise uniquement l'arithmétique de base et le théorème de Wilson. Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
C # 5.0
7877Non golfé
la source
Pyth -
76 octetsPuisque d'autres utilisent des fonctions de factorisation principales ...
Suite de tests .
la source
Bash + coreutils, 30
Ideone.
Pack Bash + coreutils + BSD-games, 22
Cette réponse plus courte exige que vous avez le paquet bsdgames installé:
sudo apt install bsdgames
.la source
Pyke,
86 octetsEssayez-le ici!
Merci à Maltysen pour le nouvel algorithme
la source
C #, 157 octets
Programme complet avec cas de test:
Commence à prendre un certain temps une fois que vous avez dépassé le million.
la source
Matlab, 60 octets
Poursuivant mon attachement aux fonctions Matlab à une ligne. Sans utiliser une factorisation intégrée:
Étant donné qu'un nombre premier
y
n'a que deux facteurs[1,y]
: nous comptons les nombres dans la plage[1,x]
qui n'ont que deux facteurs.L'utilisation de la factorisation permet un raccourcissement important (jusqu'à 46 octets).
Conclusion: Besoin de se pencher sur les langues de golf: D
la source
En fait, 10 octets
C'était la solution la plus courte que j'ai trouvée qui ne rencontrait pas de bugs d'interprétation sur TIO. Suggestions de golf bienvenues. Essayez-le en ligne!
Ungolfing
la source
Gelée , 3 octets
Jelly a une fonction de comptage de prime intégrée
ÆC
et une fonction de vérification de primeÆP
, cela utilise à la place une fonction de génération de prime intégréeÆR
et prend la longueurL
.Je suppose que cela est à peu près aussi limite que l'utilisation des facteurs intégrés de factorisation principale, qui prendraient également 3 octets avec
!Æv
(!
factorielle,Æv
compte les facteurs premiers)la source
PHP,
9692 octets4 octets enregistrés grâce à Roman Gräf
Testez en ligne
Code de test non golfé:
Testez en ligne
la source
isInt(...)?1:0
et pas seulementisInt(...)
APL (Dyalog Unicode) , 13 octets SBCS
Essayez-le en ligne!
⍳
ɩ ndices 1…N⧽
∘.|
table de reste (en utilisant ces deux comme axes)⍳
ɩ ndices 1… N0+.=
la somme des éléments égale à zéro (c'est-à-dire combien de diviseurs chacun a)2+.=
la somme des éléments égale à deux (ie combien de nombres premiers y a-t-il)la source
Python 3, 40 octets
Un entier impair k est premier si an seulement si 2 ** (k-1) est congru à 1 mod k. Ainsi, nous vérifions simplement cette condition et ajoutons 1 pour le cas de k = 2.
la source
MATL , 9 octets
Cela évite la décomposition en facteur premier. Sa complexité est O ( n ²).
Essayez-le en ligne!
la source
JavaScript (ES6),
50 + 246 + 243 octetsEnregistré
35 octets grâce à Neil:eval
peut accéder aun
paramètre.Le
eval(...)
vérifie sin
est premier.Solutions précédentes: le
nombre d'octets devrait être +2 car j'ai oublié de nommer la fonction
f=
(nécessaire pour la récursivité)46 + 2 octets (économisés 3 octets grâce aux productions ETH):
50 + 2 octets:
la source
eval
peut accéder aun
paramètre de votre fonction (que vous avez oublié de nommer, vous coûte 2 octets; il est bon de savoir que je ne suis pas le seul à faire cette erreur) ce qui vous fait gagner 5 octets.eval
. Testé avec Firefox, Chrome et Edge, cela a fonctionné pour moi. L'explication est eval () analyse dans le contexte de l'instruction . Deux exemples:a=12;f=b=>eval('a + 5');f(8)
affiche17
eta=12;f=a=>eval('a + 5');f(8)
affiche13
.Java 7,102 octets
Force brute
Non golfé
la source
1
. Il revient actuellement1
au lieu de0
. Vous pouvez résoudre ce problème en changeantreturn c;
enreturn n<2?0:c;
ou en changeant,c=1,
en,c=n<2?0:1,
.q 35 octets
la source
En fait, 10 octets
Si ma première réponse Actually n'est pas autorisée pour l'utilisation d'une fonction génératrice de nombres premiers, voici une réponse de secours utilisant le théorème de Wilson. Suggestions de golf bienvenues. Essayez-le en ligne!
Essayez-le en ligne
la source