É 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!



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.


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 .



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

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]

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)


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!


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

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


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.





Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.