Défi
C’est simple: avec un entier positif pouvant aller jusqu’à 1 000 000, retourne le nombre premier le plus proche.
Si le nombre lui-même est premier, vous devez alors le renvoyer; s'il y a deux nombres premiers proches du nombre fourni, renvoie le plus bas des deux.
L'entrée est sous la forme d'un entier unique, et la sortie doit également être sous la forme d'un entier.
Je me moque de la façon dont vous prenez en entrée (fonction, STDIN, etc.) ou affichez la sortie (fonction, STDOUT, etc.), tant que cela fonctionne.
Ceci est un code de golf, donc les règles standard s'appliquent - le programme avec le moins d'octets gagne!
Cas de test
Input => Output
------ -------
80 => 79
100 => 101
5 => 5
9 => 7
532 => 523
1 => 2
Réponses:
Gaia , 3 octets
Essayez-le en ligne!
Plutôt lent pour les entrées volumineuses, mais fonctionne avec suffisamment de mémoire / temps.
Je ne sais pas pourquoi,
D⌡
implicitement, pousse àz
nouveau, mais cela rend la réponse remarquablement courte!la source
JavaScript (ES6), 53 octets
Essayez-le en ligne!
Commenté
la source
05AB1E , 5 octets
Essayez-le en ligne! ou en tant que suite de tests
Inefficace pour les grands nombres
la source
Ån
c’est " En cas d’égalité, le nombre premier supérieur est poussé " Je ne savais même pas que nous avions cette fonction intégrée, tbh.Octave , 40 octets
Essayez-le en ligne!
Ceci utilise le fait qu’il existe toujours un nombre premier entre
n
et2*n
( théorème de Bertrand – Chebyshev ).Comment ça marche
la source
Japt , 5 octets
Essayez-le ou lancez tous les cas de test
la source
05AB1E , 4 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 31 octets
Essayez-le en ligne!
1000003 est le 78499ème nombre premier.
Nearest
donne la priorité aux valeurs qui apparaissent plus tôt dans la liste (qui sont plus basses).la source
Nearest[Prime@Range@#,#,1]&
pour 27Brachylog ,
75 octetsEssayez-le en ligne!
2 octets sauvés grâce à @DLosc.
Explication
la source
≜
dès le début, alors que je pensais au couplage et à la soustraction et que je ne réalisais que plus tard que j’avais besoin≜
que cela fonctionne. :)Pyth, 10 octets
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
la source
Gelée ,
97 octetsEssayez-le en ligne!
Lent pour une entrée plus importante, mais fonctionne correctement pour la plage demandée. Merci à @EriktheOutgolfer pour la sauvegarde de 2 octets!
la source
_A¥
parạ
(différence absolue). Oh, etḤ
peut vraiment l'être‘
.‘
ne fonctionnera pas toujours? Cela signifie que seuls les nombres premiers jusqu'à n + 1 seront trouvés, alors que le plus proche pourrait être n + 2.Python 2 , 71 octets
Essayez-le en ligne!
Une fonction récursive qui utilise le générateur de prime du théorème de Wilson . Les( k - 1 ) !2 , et
p
pistes du produitp%k
vaut 1 pour les nombres premiers et 0 pour les non premiers. Pour faciliter la comparaisonabs(k-n)
de différents nombres premiersk
, nous enregistronsk-n
et comparons viaabs
, en ajoutantn
pour obtenir le résultat.k
.L'expression
k+n-p%k*2*n
est conçue pour donner desk-n
nombres premiers (oùp%k=1
), et sinon une "mauvaise" valeurk+n
toujours plus grande en valeur absolue et n'affectant donc pas le minimum, de sorte que les non-premiers soient ignorés.la source
C (gcc) ,
87767472 octetsOptimisation du innat3 C # (compilateur interactif Visual C #), 100 octets
Essayez-le en ligne!
la source
r!=2
est équivalent àr-2
,n%++i?0:r++
peut très probablement êtren%++i||r++
.Bien rangé , 43 octets
Essayez-le en ligne!
Explication
C'est un lambda avec paramètre
x
. Cela fonctionne en créant la séquence suivante:C’est la fusion des deux séquences
]x, -1, -∞]
(gauche fermée, droite ouverte) et[x, ∞]
(toutes deux ouvertes).Pour
x = 80
, cela ressemble à:Ensuite, nous utilisons
f↦s
pour sélectionner tous les éléments des
satisfairef
. Dans ce cas, nous filtrons tous les nombres composés, ne laissant que les premiers. Pour le mêmex
, cela devient:Ensuite, nous utilisons
(...)@0
pour sélectionner le premier membre de cette séquence. Étant donné que le plus bas des deux doit être sélectionné, la séquence qui commence parx - 1
est épissée en premier.Remarque: Un seul élément sur
x
etx - 1
peut être premier, il est donc normal que la séquence épissée commence parx - 1
. Bien que la séquence puisse être ouverte des deux côtés ([x,-1,-∞]
), cela inclurait inutilementx
deux fois la séquence. Alors, par souci d'efficacité, j'ai choisi la version fermée à gauche (aussi parce que j'aime montrer Tidy).la source
Facteur , 91 octets
Essayez-le en ligne!
la source
APL (Dyalog Extended) ,
20SBCS de 15 octetsFonction de préfixe tacite inspirée de la réponse de Galen Ivanov .
Essayez-le en ligne!
⍳
ɩ ndices un à l'argument.¯2⍭
nièmes premiers de cela⊢(
…)
Applique la fonction tacite suivante à celle-ci, avec l'argument d'origine en tant qu'argument de gauche:⊢
les primes⊇
indexé par:⍋
la note ascendante (indices triés par ordre croissant)⍤
de|
la magnitude (valeur absolue)⍤
des-
différences⊃
choisissez le premier (c'est-à-dire celui qui présente la plus petite différence)la source
Perl 6 , 35 octets
Essayez-le en ligne!
Cela fait appel à la technique de Veitcel pour générer la liste
0, -1, 2, -3
mais simplifie grandement l’($*=-1)*$++
utilisation des variables d’état anonymes disponibles dans P6 (je l’avais à l’origine-1 ** $++ * $++
mais j’ai perdu la priorité lorsqu’il est négatif). Il existe un vérificateur principal intégré, mais malheureusement, iluntil
empêche la valeur renvoyée automatiquement, de sorte qu'il y a une attente supplémentaire$_
.la source
C,
122121104 octetsUtilisez-la en appelant la fonction
c()
et en passant comme argument le nombre; il devrait retourner le nombre premier le plus proche.Merci à Incarnation of Ignorance pour
1 octet enregistréune grande amélioration.Essayez-le en ligne!
la source
c()
receives two parameters... Also, you can probably shorten thewhile(1)
tofor(;;)
(untested, since I don't get how to run your codec()
passing only the first parameter. And you are right,for(;;)
saves me a byte, only 117 left to get first place :)#define r return p(a,i){i=1;while(++i<a)if(a%i<1)r 0;r a>1;}c(a,b){b=a;for(;;b++){if(p(--a))r a;if(p(b))r b;}}
. Here is a TIO link: tio.run/…Wolfram Language (Mathematica), 52 bytes
Try it online!
la source
APL(NARS), 38 chars, 76 bytes
0π is the test for prime, ¯1π the prev prime, 1π is the next prime; test:
la source
J,
1915 bytesTry it online!
la source
Perl 5, 59 bytes
Try it online!
/^.?$|^(..+?)\1+$/
is tricky regexp to check prime(-1)**$a*($a++)
generate sequence 0,-1, 2,-3 ...la source
MathGolf, 10 bytes
Try it online.
Explanation:
la source
Python 2 (Cython), 96 bytes
Try it online!
la source
r=range;...
C# (Visual C# Interactive Compiler),
104100 bytesTry it online!
Explanation:
la source
Java 8,
8887 bytesPort of @NaturalNumberGuy's (first) C answer, so make sure to upvote him!!
-1 byte thanks to @OlivierGrégoire.
Try it online.
Explanation:
la source
Java (JDK), 103 bytes
Try it online!
la source
;
. :) Do you want me to delete my answer?.. Feel free to copy the explanation.Haskell,
7974 bytes (thanks to Laikoni)72 bytes as annonymus function (the initial "f=" could be removed in this case).
Try it online!
original code:
Try it online!
Explanation:
la source
,
instead of&&
.(last$ ...)
can belast(...)
, and the second guard1>0
can be used for a binding to save parenthesis, e.g.y<-x+n
.f=
does not need to be counted. Also the parenthesis enclosing(-1+n)
can be dropped.VDM-SL, 161 bytes
A full program to run might look like this - it's worth noting that the bounds of the set of primes used should probably be changed if you actually want to run this, since it will take a long time to run for 1 million:
Explanation:
la source
MATL, 6 bytes
Try it online!
List the first
n
primes and find the one closest ton
.la source
C# (Visual C# Interactive Compiler), 112 bytes
Try it online!
Left shifts by 20 in submission but 10 in TIO so that TIO terminates for test cases.
la source