Votre défi, si vous l'acceptez, consiste à coder une fonction qui renvoie vrai ou faux (ou une représentation significative similaire de oui et non) si un nombre répond aux critères suivants:
- L'entier lui-même est un nombre premier OU
- L'un de ses entiers voisins est premier
Par exemple:
Une entrée de 7
renverrait True.
Une entrée de 8
renverrait également True.
Une entrée de 15
renvoie False. (Ni 14, 15 ou 16 ne sont premiers)
L'entrée doit pouvoir retourner correctement pour les nombres compris entre 2 ^ 0 et 2 ^ 20 inclus, donc il n'y a pas besoin de s'inquiéter des problèmes de signe ou des débordements d'entiers.
code-golf
number
primes
decision-problem
M. Llama
la source
la source
Réponses:
J, 17
Renvoie des booléens encodés en codes de retour de processus: zéro pour vrai, différent de zéro pour faux. Exemple d'utilisation:
la source
*/0 p:<:,],>:
est plus court et une fonction appropriée (lambda) est([:*/0 p:<:,],>:)
Haskell, 47 caractères
la source
Python
8580Première fois sur Code Golf donc il y a probablement quelques trucs qui me manquent.
la source
[]
. tous seront plus qu'heureux de travailler avec une expression de générateur. Si cela ne vous dérange pas que votre code soit laid, vous pouvez également supprimer les espaces entre0
etfor
, et)
etor
.f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
Ce n'est pas un vrai candidat à la brièveté du code, mais nous soumettons toujours, car la détermination de la primauté par l'expression régulière est tordue à bien des égards!
Python (2.x), 85 caractères
la source
Rubis (55 ou 50 comme lambda)
ou comme lambda (utiliser
g[23]
pour l'appeler)Coffeescript (53)
la source
La solution Mathematica ennuyeuse , 35 !
la source
Or@@PrimeQ/@{n-1,n,n+1}
.Or@@PrimeQ@{#-1,#,#+1}&
(la barre oblique dans son code n'est pas nécessaire)C,
1128272 caractèresSuite au commentaire d'Ilmari Karonen, sauvé 30 caractères en supprimant
main
,P
retourne maintenant vrai / faux. Boucle également remplacée par récursivité, et quelques ajustements supplémentaires.Version originale:
la source
main(n,m)int**m;
.Mathematica, 24 octets
Je ne sais pas pourquoi cet ancien article est apparu dans ma liste aujourd'hui, mais j'ai réalisé que Mathematica est compétitif ici.
Fonction sans nom prenant un argument entier et retournant
True
ouFalse
. Mise en œuvre directe.la source
PrimeQ
threads sur les listes, doncOr@@PrimeQ@{#-1,#,#+1}&
(ouOr@@PrimeQ[#+{-1,0,1}]&
) fonctionne également, pour -1 octet. (Bien que, je suppose que je ne sais pas siPrimeQ
les listes sont enfilées en 2012.)Stax , 6 octets
Exécuter et déboguer
Explication (déballé):
la source
JavaScript (71
7380)Démo: http://jsfiddle.net/ydsxJ/3/
Edit 1: Changez
for(i=2;i<j;i++)
enfor(i=1;++i<j;)
(merci@minitech
). Convertir l'if
instruction en ternaire. Déplacér|=p
etp=1
à l'extérieurfor
pour éliminer les accolades intérieures. 7 caractères enregistrés.Edit 2: Combinez
p=1
etj++<=n
àp=j++<=n
, enregistrez 2 caractères (merci@ugoren
).la source
for(i=1;++i<j;)
au lieu defor(i=2;i<j;i++)
pour enregistrer 1 caractère supplémentaire.!j%i
ne fonctionnera pas en raison de la priorité. Une alternative de travail estj%i<1
.p=j++<=n
? Si Javascript est comme C ici, cela devrait fonctionner.Regex (ECMAScript), 20 octets
^x?x?(?!(x+)(x\1)+$)
Essayez-le en ligne!
La version ci-dessus ne gère pas correctement zéro, mais cela ne prend qu'un octet supplémentaire:
^x?x?(?!(x+)(x\1)+$)x
En bonus supplémentaire, voici une version qui donne une correspondance de retour
1
pour un de moins qu'un premier,2
pour un premier et3
pour un de plus qu'un premier:^x?x??(?!(x+)(x\1)+$)x
Essayez-le en ligne!
la source
C #, 96
Il renvoie -1,0,1 pour vrai, tout le reste est faux.
Toutes les suggestions pour le raccourcir seraient merveilleuses!
Forme développée:
la source
if(i==r-1)break;
et changer le milieu de lafor
boucle dei<r
ài<r-1
. Cela vous ramènerait à 82.GolfScript: 26
Explication: le bloc le plus intérieur
{.:i,{i\%!},,2=@|\(}
détermine si le haut de la pile est premier en vérifiant s'il y a exactement 2 facteurs de moins que le haut de la pile. Il dissocie ensuite cela avec le deuxième élément de la pile, qui contient l'état de voir si un premier a encore été vu. Enfin, il décrémente le nombre en haut de la pile.Commencez par incrémenter l'entrée, en initialisant l'état premier vu, et répétez le bloc 3 fois. Comme cela va décrémenter deux fois, mais nous avons commencé par incrémenter, cela couvrira
n+1
etn-1
.la source
C #,
8797 caractèresla source
CJam, 12 octets
CJam est beaucoup plus jeune que ce défi, donc cette réponse n'est pas éligible pour la coche verte (qui devrait être mise à jour de toute façon pour la réponse de randomra). Cependant, jouer au golf était en fait assez amusant - j'ai commencé à 17 octets, puis j'ai changé complètement d'approche trois fois, économisant un ou deux octets à chaque fois.
Il s'agit d'un bloc, l'équivalent le plus proche d'une fonction dans CJam, qui attend l'entrée sur la pile et laisse un 1 (vrai) ou 0 (faux) sur la pile.
Testez-le ici.
Voici comment cela fonctionne:
la source
F #, 68 octets (non concurrents)
Essayez-le en ligne!
C'est pourquoi j'aime le golf à code. Je suis toujours très vert avec F # mais j'apprends beaucoup sur le fonctionnement du langage et ce qu'il peut faire de ce genre de défis.
la source
APL (Dyalog Classic) , 20 octets
Essayez-le en ligne!
la source
Rétine , 22 octets
Essayez-le en ligne!
Prend unaire comme entrée
la source
Java 8, 83 octets
Renvoie
true
/ enfalse
tant que valeurs véridiques / falsey.Essayez-le en ligne.
Explication: "
Il
int p(int n)
en résultera donc-1
pourn=0
et non premiers, et se traduira parn-1
pourn=1
ou premiers. Puisquep(0)+p(1)+p(2)
deviendra-1+0+1 = 0
et retournerait faux (même si2
c'est un nombre premier), len=1
c'est un cas de bord utilisant cette approche.Une boucle unique sans méthode séparée ferait 85 octets :
Retour
1
/ en0
tant que valeurs véridiques / falsey.Essayez-le en ligne.
Explication:
la source
Japt , 7 octets
Essayez-le en ligne!
la source
R, 68 caractères
Utilisation (1 pour VRAI, 0 pour FAUX):
la source
i(n-1)|i(n)|i(n+1)
place deifelse(i(n-1)|i(n)|i(n+1),1,0)
?C ++
la source
Q,
43 caractères36la source
J, 16 caractères
la source
Python,
6967 caractères8**7 > 2**20
tout en étant un peu plus court à écrirela source
Ruby, 47 caractères mais très lisible
la source
C ++ 97
ugoren semble m'avoir battu vers la solution intelligente. Il est donc une version abrégée de l'approche en boucle à trois reprises:
la source
Forth (gforth) , 104 octets
Essayez-le en ligne!
Explication
Chèque principal (p)
Fonction principale (f)
la source
Julia 0.4 , 23 octets
Essayez-le en ligne!
la source
Gelée , 5 octets
Essayez-le en ligne!
Comment ça fonctionne
la source