Est-ce un Pascal Prime?

18

Il est bien connu que les nombres premiers impairs apparaîtront exactement deux fois dans le triangle de Pascal. Cependant, tous les nombres qui apparaissent exactement deux fois dans le triangle de Pascal ne sont pas premiers. Nous appellerons ces nombres Pascal premiers.

Les nombres premiers Pascal sont des nombres composites qui apparaissent exactement deux fois dans le triangle de Pascal. Les premiers nombres premiers Pascal sont

4, 8, 9, 12, 14, 16, 18, ...

Votre défi est de prendre un entier positif n comme entrée et sortie vrai ou faux, selon que n est un nombre premier Pascal ou non. C'est du golf de code, donc le programme le plus court gagne!

Art tout simplement magnifique
la source
OEIS pertinent.
Martin Ender
2
Pouvons-nous afficher True si ce n'est pas un nombre premier Pascal et false s'il l'est?
caird coinheringaahing
Cette séquence est la séquence OEIS A002808 l'intersection de » avec séquence OEIS A137905 .
2018 totalement humain
@cairdcoinheringaahing non, il doit être dans l'exigence donnée.
Simply Beautiful Art
Je suis surpris que personne n'ait posté de réponse en Pascal. Je le ferai si j'ai le temps (et si je peux retrouver mon ancien compilateur Pascal).
manassehkatz-Reinstate Monica

Réponses:

10

Wolfram Language (Mathematica) , 45 octets

CompositeQ@#&&Binomial~Array~{#-1,#}~FreeQ~#&

Essayez-le en ligne!

Chaque nombre composé n apparaît exactement deux fois sur la ligne n et ne peut pas apparaître par la suite. Donc, la condition pour les nombres premiers Pascal est qu'ils n'apparaissent pas du tout dans les n-1 premières lignes.

Pour autant que je sache, c'est plus court que de vérifier qu'il apparaît exactement deux fois dans les n premières lignes et de pouvoir l'utiliser à la !PrimeQplace.

Martin Ender
la source
4

Python 2 , 93 octets

def f(n):l=[1];exec"(n in l)>=any(n%k<1for k in range(2,n))>q;l=map(sum,zip([0]+l,l+[0]));"*n

Essayez-le en ligne!

Il s'agit d'une fonction nommée f , qui sort via le code de sortie , 0 pour Pascal Primes, 1 sinon.

Comment ça marche?

def f(n):l=[1];                       # Define a function f (arg. n) and a list l = [1].
exec"..."*n                           # Execute n times.
(n in l)                              # Boolean: "n is in l?" is greater than...
   >=any(n%k<1for k in range(2,n))    # the boolean: "Is n composite?"?
            >q;                       # If the boolean comparison returns a falsy
                                      # result, then continue on without any difference.
                                      # Otherwise, evaluate the other part of the
                                      # inequality, thus performing "is greater than q".
                                      # Since we have no variable "q", this terminates
                                      # with exit code 1, throwing a "NameError".
l=map(sum,zip([0]+l,l+[0]));          # Generate the next row in Pascal's triangle,
                                      # By zipping l prepended with a 0 with l appended
                                      # with a 0 and mapping sum over the result.

Cela vérifie essentiellement si n se produit dans les n - 1 premières lignes du triangle de Pascal ou s'il est premier, et renvoie une erreur si l'une de ces deux conditions est remplie.

Sauvegardé 1 octet grâce aux ovs .

M. Xcoder
la source
93 octets
ovs
@ovs: o C'est intelligent! Merci.
M. Xcoder
4

Gelée , 11 10 9 octets

Grâce à:

  • Martin Ender pour -1 octet! (autre approche, utilisez (+1) évitez d'utiliser n2(-2), donc -1 dans l'ensemble.
  • Jonathan Allan pour correction de bogue.
  • Dennis pour un autre -1 octet.
Ḷc€ḶFċ=ÆP

Essayez-le en ligne!

Approche alternative , par Jonathan Allan . (défectueux)

----------- Explanation -----------
Ḷ            Lowered range. [0, 1, ..., n-1]
 c€Ḷ           `c`ombination `€`ach with `Ḷ`owered range [0...n-1]
    F        Flatten.
     ċ       Count the number of occurences of (n) in the list.
       ÆP    Returns 1 if (n) is a prime, 0 otherwise.
      =      Check equality.

Explication pour la dernière ligne:

  • Comme l'a souligné Martin Ender, " napparaît deux fois dans le triangle Pascal" équivaut à " nn'apparaît pas dans les premières n-1lignes".
  • Nous voulons revenir truesi le nombre n'est pas un nombre premier (c'est-à-dire ÆP == 0) et que le nombre cest nul. On peut en déduire cela ÆP == c.
    On peut prouver que s'ils sont égaux, alors ils sont égaux à 0, car:
    • ÆP renvoie une valeur booléenne, qui ne peut être que 0 ou 1.
    • S'il renvoie 1, alors nest un nombre premier, donc il ne peut pas apparaître dans les premières n-1lignes (c'est-à-dire c == 0)
user202729
la source
1n'est pas un nombre premier Pascal; cela dit que c'est le cas.
Jonathan Allan
Ḷc€ḶFċoÆP¬fonctionnerait je pense.
Jonathan Allan
ċ=ÆPdevrait marcher.
Dennis
Pour info j'ai trouvé une faille dans mon approche et l'ai supprimée.
Jonathan Allan
BTW Ḷcþ`Fċ=ÆPdevrait également fonctionner.
M. Xcoder
4

Haskell , 86 84 octets

p=[]:[zipWith(+)(1:x)x++[1]|x<-p]
f n=all((>0).rem n)[2..n-1]==any(elem n)(take n p)

Essayez-le en ligne!

Explication

La fonction pdéfinit récursivement un triangle de Pascal dégénéré:

[]
[1]
[2,1]
[3,3,1]
[4,6,4,1]
[5,10,10,5,1]

Comme nous pouvons le voir (dans cette solution, 1c'est quelque chose de spécial), chaque nombre napparaît exactement deux fois dans la n+1th ligne et tous les éléments des lignes suivantes ne font que s'agrandir, donc nous avons seulement besoin de vérifier si nest quelque part jusqu'à la nth ligne pour voir si un l'élément est disqualifié:

any(elem n)(take(n-1)p)

Maintenant, nous avons Truepour tous les éléments qui apparaissent plus de deux fois (sauf 1), donc tout ce dont nous avons besoin est d'avoir une isPrimefonction défectueuse qui retourne Truepour 1:

all((>0).rem n)[2..n-1]
ბიმო
la source
4

APL (Dyalog) , 44 34 24 19 octets

5 octets enregistrés grâce à @Cowsquack

(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳

Essayez-le en ligne!

Comment?

Nous nous assurons que ni

- gamme 0.. n-1,

⍳∘.! - sur binôme cartésien avec soi

⊢∊ - contenir n ,

- pas plus

⊢|⍨ - n modulo chaque élément de

2↓⍳- gamme 2..n-1

~0∊- ne contient pas 0(alias non divisible)

Uriel
la source
Le convertir en train (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)est plus court de deux octets
Kritixi Lithos
@Cowsquack hmm, je n'ai pas remarqué qu'il était si court qu'un train pouvait tenir (au départ à 40 octets). Merci!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳pour deux autres, j'ai changé l'algorithme de vérification de primalité
Kritixi Lithos
@Cowsquack oo intelligent. Je n'ai jamais vu cette variation de primalité auparavant
Uriel
Réorganiser le ~donne (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳pour un octet de moins.
Kritixi Lithos
2

JavaScript (Node.js) , 103 101 octets

n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>r(i=>i<2|n%i)

Essayez-le en ligne!

l4m2
la source
n=>(r=x=>[...Array(n).keys(F=n=>n>0?n*F(n-1):1)].every(x))(i=>r(j=>F(i)/F(j)/F(i-j)-n))>F(n-1)**2%nthreority fonctionne mais en fait pour petite gamme
l4m2
2

Rubis , 97 95 octets

->n{c=!r=[1,1]
(2...n).map{|i|c|=1>n%i
[n]&r=[0,*r,0].each_cons(2).map{|a,b|a+b}}&[[n]]==[]&&c}

Essayez-le en ligne!

Gratté quelques octets.

Réintégrer Monica - notmaynard
la source
2

R , 55 octets

function(n)sum(!n%%1:n)>2&!n%in%outer(1:n-1,1:n,choose)

Essayez-le en ligne!

sum(!n%%1:n)>2est le test composite et outer(1:n-1,1:n,choose)Calcule lignes 0à n-1du triangle de Pascal, de sorte que nous nous assurons que nne semble pas là.

Giuseppe
la source
2

05AB1E , 10 octets

ÝDδcI¢IpÌQ

Essayez-le en ligne!

Explication

Ý            # push range [0 ... input]
 D           # duplicate
  δc         # double vectorized command binomial
    I¢       # count occurrences of input
      Ip     # check input for primality
        Ì    # add 2
         Q   # compare for equality

Vérifie qui nse produit exactement deux fois dans les n + 1 premières rangées de triangle pascals et n'est pas premier.
La comparaison fonctionne car il n'y a pas de nombres premiers pouvant apparaître 3 fois dans le triangle.

Emigna
la source
1

Haskell , 90 octets

f n=2==sum[1|i<-[0..n],j<-[0..i],p[j+1..i]`div`p[1..i-j]==n,mod(p[1..n-1]^2)n<1]
p=product

Essayez-le en ligne!

totalement humain
la source
1

JavaScript (Node.js) , 79 133 130 128 octets

f=(n,a=[1])=>n<a.length||[...'0'.repeat(n)].filter((x,i)=>n%i<1).length>1&&a.indexOf(n)<0&&f(n,[...a.map((x,i)=>x+a[i-1]||1),1])

Essayez-le en ligne!

vérificateur principal du mal +50 octets :(

Shieru Asakoto
la source
0

Python 2 , 105 104 bytes

merci à user202729 pour -1 octet

a=q=[1];n=input();r=n<4;p=1
for i in range(2,n):q=a+map(sum,zip(q[1:],q))+a;r+=n in q;p*=n%i
print p+r<1

Essayez-le en ligne!

ovs
la source
La paire de parenthèses autour p+rsemble redondante ...
user202729