¿Es un Pascal Prime?

18

Es bien sabido que aparecerán números primos impares en el triángulo de Pascal exactamente dos veces. Sin embargo, no todos los números que aparecen exactamente dos veces en el triángulo de Pascal son primos. Llamaremos a estos números números primos de Pascal.

Los números primos de Pascal son números compuestos que aparecen exactamente dos veces en el triángulo de Pascal. Los primeros pocos primos de Pascal son

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

Su desafío es tomar un entero positivo n como entrada y salida verdadero o falso, dependiendo de si n es un primo Pascal o no. Este es el código de golf, por lo que gana el programa más corto.

Simplemente hermoso arte
fuente
OEIS relevantes.
Martin Ender
2
¿Podemos generar True si no es un primer Pascal y falso si lo es?
caird coinheringaahing
Esta secuencia es la intersección de la secuencia OEIS A002808 con la secuencia OEIS A137905 .
Totalmente humano el
@cairdcoinheringaahing no, debe estar en el requisito dado.
Simply Beautiful Art el
Me sorprende que nadie haya publicado una respuesta en Pascal. Lo haré si tengo tiempo (y si puedo encontrar mi viejo compilador Pascal).
manassehkatz-Reinstate Monica

Respuestas:

10

Wolfram Language (Mathematica) , 45 bytes

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

Pruébalo en línea!

Cada número compuesto n aparece exactamente dos veces en la fila n y no puede aparecer después. Entonces, la condición para los números primos de Pascal es que no aparecen en absoluto dentro de las primeras n-1 filas.

Por lo que puedo decir, esto es más corto que verificar que aparece exactamente dos veces dentro de las primeras n filas y poder usar !PrimeQen su lugar.

Martin Ender
fuente
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

Pruébalo en línea!

Esta es una función con nombre f , que sale a través del código de salida , 0 para Pascal Primes, 1 de lo contrario.

¿Cómo funciona esto?

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.

Básicamente, esto verifica si n ocurre en las primeras n - 1 filas del triángulo de Pascal o si es primo, y arroja un error si se cumple alguna de estas dos condiciones.

Guardado 1 byte gracias a los ovs .

Sr. Xcoder
fuente
93 bytes
ovs
@ovs: o ¡Eso es inteligente! Gracias.
Sr. Xcoder
4

Gelatina , 11 10 9 bytes

Gracias a:

  • Martin Ender por -1 byte! (otro enfoque, use (+1) evite usar n2(-2), entonces -1 en general.
  • Jonathan Allan para la corrección de errores.
  • Dennis por otro -1 byte.
Ḷc€ḶFċ=ÆP

Pruébalo en línea!

Enfoque alternativo , por Jonathan Allan . (defectuoso)

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

Explicación de la última línea:

  • Como señaló Martin Ender, " naparece dos veces en el triángulo de Pascal" es equivalente a " nno aparece en las primeras n-1filas".
  • Queremos volver truesi el número no es primo (es decir ÆP == 0) y el recuento ces cero. De eso podemos deducir eso ÆP == c.
    Se puede demostrar que si son iguales, entonces son iguales a 0, porque:
    • ÆP devuelve un valor booleano, que solo puede ser 0 o 1.
    • Si devuelve 1, entonces nes primo, por lo tanto, no puede aparecer en las primeras n-1líneas (es decir, c == 0)
usuario202729
fuente
1no es un primo de Pascal; Esto dice que es.
Jonathan Allan
Ḷc€ḶFċoÆP¬funcionaría, creo.
Jonathan Allan
ċ=ÆPDeberia trabajar.
Dennis
FYI encontré un defecto en mi enfoque y lo he eliminado.
Jonathan Allan
Por cierto Ḷcþ`Fċ=ÆP, también debería funcionar.
Sr. 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)

Pruébalo en línea!

Explicación

La función pdefine recursivamente un triángulo de Pascal degenerado:

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

Como podemos ver (en esta solución 1es algo especial) cada número naparece exactamente dos veces en la n+1fila th y todos los elementos de las filas posteriores solo se hacen más grandes, por lo tanto, solo tenemos que verificar si nestá en algún lugar hasta la nfila th para ver si un El elemento está descalificado:

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

Ahora tenemos Truepara todos los elementos que aparecen más de dos veces (excepto 1), por lo que todo lo que necesitamos es tener una isPrimefunción defectuosa que regrese Truepara 1:

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

APL (Dyalog) , 44 34 24 19 bytes

5 bytes guardados gracias a @Cowsquack

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

Pruébalo en línea!

¿Cómo?

Nos aseguramos de que tampoco

- rango 0.. n-1,

⍳∘.! - sobre binomio cartesiano con uno mismo

⊢∊- contener n,

- tampoco

⊢|⍨- nmódulo de cada elemento de

2↓⍳- rango 2..n-1

~0∊- no contiene 0(también conocido como no divisible)

Uriel
fuente
Convertirlo en un tren (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)es más corto en dos bytes
Kritixi Lithos
@Cowsquack hmm No me di cuenta de que se hizo tan corto que un tren podía caber (comenzó como 40 byter). ¡Gracias!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳por otros dos, cambié el algoritmo de comprobación de primalidad
Kritixi Lithos el
@Cowsquack oo inteligente. Nunca he visto esa variación de primalidad antes
Uriel
Reordenar la ~da (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳por uno menos bytes.
Kritixi Lithos
2

JavaScript (Node.js) , 103101 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)

Pruébalo en línea!

l4m2
fuente
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 funciona pero de hecho para un rango pequeño
l4m2
2

Rubí , 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}

Pruébalo en línea!

Rascó un par de bytes.

Restablecer a Monica - notmaynard
fuente
2

R , 55 bytes

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

Pruébalo en línea!

sum(!n%%1:n)>2es la prueba y compuestos outer(1:n-1,1:n,choose)Calcula filas 0a n-1del triángulo de Pascal, por lo que nos aseguramos de que nno aparece allí.

Giuseppe
fuente
2

05AB1E , 10 bytes

ÝDδcI¢IpÌQ

Pruébalo en línea!

Explicación

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

Verificaciones que nocurren exactamente dos veces en las primeras n + 1 filas del triángulo pascal y no son primos.
La comparación funciona ya que no hay números primos que pueden ocurrir 3 veces en el triángulo.

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

Pruébalo en línea!

malvado primer corrector +50 bytes :(

Shieru Asakoto
fuente
0

Pitón 2 , 105 104 bytes

gracias 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

Pruébalo en línea!

ovs
fuente
El par de paréntesis p+rparece redundante ...
user202729