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!



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.


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 .



@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)

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]

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)


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!


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

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à.


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.





En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.