É um Pascal Prime?

18

É sabido que números primos ímpares aparecerão no triângulo de Pascal exatamente duas vezes. No entanto, nem todos os números que aparecem exatamente duas vezes no triângulo de Pascal são primos. Vamos chamar esses números de Pascal primos.

Os números primos de Pascal são números compostos que aparecem exatamente duas vezes no triângulo de Pascal. Os primeiros primos Pascal são

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

Seu desafio é pegar um número inteiro positivo n como entrada e saída verdadeiro ou falso, dependendo se n for um primo Pascal ou não. Isso é código-golfe, então o programa mais curto vence!

Arte simplesmente bonita
fonte
OEIS relevante.
Martin Ender 01/01
2
Podemos produzir True se não for um primo de Pascal e false se for?
caird coinheringaahing
Esta sequência é OEIS sequência A002808 intersecção 's com OEIS A137905 sequência .
totallyhuman
@cairdcoinheringaahing não, ele deve estar no requisito especificado.
Versão
Estou surpreso que ninguém tenha postado uma resposta em Pascal. Eu vou se eu conseguir o tempo (e se eu puder encontrar meu antigo compilador Pascal).
manassehkatz-Reintegrar Monica

Respostas:

10

Wolfram Language (Mathematica) , 45 bytes

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

Experimente online!

Todo número composto n aparece exatamente duas vezes na linha n e não pode aparecer depois. Portanto, a condição para os primos do Pascal é que eles não aparecem nas primeiras n-1 linhas.

Até onde eu sei, isso é mais curto do que verificar se ele aparece exatamente duas vezes nas primeiras n linhas e poder usá-lo !PrimeQ.

Martin Ender
fonte
4

Python 2 , 93 bytes

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

Experimente online!

Esta é uma função nomeada f , que sai via código de saída , 0 para Pascal Primes, 1 caso contrário.

Como isso funciona?

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.

Isso basicamente verifica se n ocorre nas primeiras n - 1 linhas do triângulo de Pascal ou se é primo e gera um erro se alguma dessas duas condições for atendida.

Economizou 1 byte graças a ovs .

Mr. Xcoder
fonte
93 bytes
ovs 1/1
@ovs: o Isso é inteligente! Obrigado.
Sr. Xcoder 01/01/19
4

Geléia , 11 10 9 bytes

Graças a:

  • Martin Ender por -1 byte! (outra abordagem, use (+1) evite usar n2(-2), portanto, -1 no geral.
  • Jonathan Allan para correção de bugs.
  • Dennis por outro -1 byte.
Ḷc€ḶFċ=ÆP

Experimente online!

Abordagem alternativa , por Jonathan Allan . (defeituoso)

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

Explicação para a última linha:

  • Conforme apontado por Martin Ender, " naparece duas vezes no triângulo Pascal" é equivalente a " nnão aparece nas primeiras n-1linhas".
  • Queremos retornar truese o número não for primo (ou seja, ÆP == 0) e a contagem cfor zero. A partir disso, podemos deduzir isso ÆP == c.
    Pode-se provar que, se são iguais, são iguais a 0, porque:
    • ÆP retorne um valor booleano, que pode ser apenas 0 ou 1.
    • Se retornar 1, nserá primo e, portanto, não poderá aparecer nas primeiras n-1linhas (ou seja, c == 0)
user202729
fonte
1não é primo de Pascal; isto diz que é.
Jonathan Allan
Ḷc€ḶFċoÆP¬funcionaria eu acho.
Jonathan Allan
ċ=ÆPDeveria trabalhar.
Dennis
Para sua informação, encontrei uma falha na minha abordagem e a excluí.
Jonathan Allan
BTW também Ḷcþ`Fċ=ÆPdeve funcionar.
Mr. Xcoder
4

Haskell , 86 84 bytes

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

Experimente online!

Explicação

A função pdefine recursivamente um triângulo de Pascal degenerado:

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

Como podemos ver (nesta solução 1é algo especial), todo número naparece exatamente duas vezes na n+1quinta linha e todos os elementos das linhas subseqüentes apenas naumentam ; portanto, precisamos verificar se está em algum lugar até a nquinta linha para ver se um O elemento é desqualificado:

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

Agora, como temos Truetodos os elementos que aparecem mais de duas vezes (exceto 1), tudo o que precisamos é ter uma isPrimefunção defeituosa que retorne Truepara 1:

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

APL (Dyalog) , 44 34 24 19 bytes

5 bytes salvos graças a @Cowsquack

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

Experimente online!

Quão?

Garantimos que nem

- intervalo 0.. n-1,

⍳∘.! - no binômio cartesiano consigo mesmo

⊢∊- conter n,

- nem

⊢|⍨- nmódulo cada item de

2↓⍳- faixa 2..n-1

~0∊- não contém 0(também conhecido como não divisível)

Uriel
fonte
Convertê-lo em um trem (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)é mais curto por dois bytes
Kritixi Lithos
@ Cowsquack hmm eu não percebi que ficou tão curto que um trem poderia caber (começou com 40 byter). Obrigado!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳por mais dois, eu mudei o algoritmo primality verificação
Kritixi Lithos
@Cowsquack oo inteligente. Eu nunca tinha visto que a variação primality antes
Uriel
Reorganizando a ~(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳por menos um byte.
Kritixi Lithos 01/01
2

JavaScript (Node.js) , 103 101 bytes

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)

Experimente online!

l4m2
fonte
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%nobras threority mas na verdade para pequeno intervalo
l4m2
2

Ruby , 97 95 bytes

->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}

Experimente online!

Raspou alguns bytes.

Restabelecer Monica - notmaynard
fonte
2

R , 55 bytes

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

Experimente online!

sum(!n%%1:n)>2é o teste e compostas outer(1:n-1,1:n,choose)linhas Calcula 0a n-1do triângulo de Pascal, por isso certifique-se nnão aparecer lá.

Giuseppe
fonte
2

05AB1E , 10 bytes

ÝDδcI¢IpÌQ

Experimente online!

Explicação

Ý            # 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

Verifica que nocorre exatamente duas vezes nas primeiras n + 1 linhas do triângulo pascal e não é primo.
A comparação funciona, pois não há números primos que possam ocorrer 3 vezes no triângulo.

Emigna
fonte
1

Haskell , 90 bytes

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

Experimente online!

totalmente humano
fonte
1

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

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

Experimente online!

verificador primário do mal +50 bytes :(

Shieru Asakoto
fonte
0

Python 2 , 105 104 bytes

graças a user202729 por -1 byte

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

Experimente online!

ovs
fonte
O par de parênteses p+rparece redundante ...
user202729 01/01