Apakah ini Pascal Prime?

18

Diketahui bahwa bilangan prima aneh akan muncul dalam segitiga Pascal tepat dua kali. Namun, tidak semua angka yang muncul tepat dua kali dalam segitiga Pascal adalah prima. Kami akan memanggil nomor-nomor ini sebagai bilangan prima Pascal.

Bilangan prima Pascal adalah bilangan komposit yang muncul tepat dua kali dalam segitiga Pascal. Beberapa bilangan prima Pascal pertama adalah

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

Tantangan Anda adalah untuk mengambil bilangan bulat positif n sebagai input dan output benar atau salah, tergantung pada apakah n adalah prima Pascal atau tidak. Ini kode-golf, jadi program tersingkat menang!

Seni Cukup Indah
sumber
OEIS yang relevan.
Martin Ender
2
Bisakah kita menghasilkan Benar jika itu bukan Pascal prime dan false jika itu?
caird coinheringaahing
Urutan ini Oei urutan A002808 persimpangan 's dengan Oei urutan A137905 .
Sepenuhnya manusiawi
@cairdcoinheringaahing no, itu harus dalam persyaratan yang diberikan.
Simply Beautiful Art
Saya terkejut tidak ada yang mengirim jawaban di Pascal. Saya akan jika saya mendapatkan waktu (dan jika saya dapat menemukan kompiler Pascal lama saya).
manassehkatz-Reinstate Monica

Jawaban:

10

Bahasa Wolfram (Mathematica) , 45 byte

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

Cobalah online!

Setiap angka komposit n muncul tepat dua kali pada baris n dan tidak dapat muncul sesudahnya. Jadi syarat untuk bilangan prima Pascal adalah bahwa mereka tidak muncul sama sekali dalam baris n-1 pertama .

Sejauh yang saya tahu, ini lebih pendek daripada memeriksa bahwa itu muncul tepat dua kali dalam pertama n baris dan mampu menggunakan !PrimeQsebagai gantinya.

Martin Ender
sumber
4

Python 2 , 93 byte

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

Cobalah online!

Ini adalah fungsi bernama f , yang output melalui kode keluar , 0 untuk Pascal Primes, 1 sebaliknya.

Bagaimana ini bekerja?

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.

Ini pada dasarnya memeriksa apakah n muncul dalam baris n - 1 pertama Pascal's triangle atau jika prime, dan melempar kesalahan jika salah satu dari kedua kondisi ini terpenuhi.

Disimpan 1 byte berkat ovs .

Tuan Xcoder
sumber
93 byte
ov
@ovs: o Itu pintar! Terima kasih.
Tn. Xcoder
4

Jelly , 11 10 9 byte

Terimakasih untuk:

  • Martin Ender untuk -1 byte! (pendekatan lain, gunakan (+1) hindari menggunakan n2(-2), jadi -1 keseluruhan.
  • Jonathan Allan untuk perbaikan bug.
  • Dennis untuk -1 byte lainnya.
Ḷc€ḶFċ=ÆP

Cobalah online!

Pendekatan alternatif , oleh Jonathan Allan . (cacat)

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

Penjelasan untuk baris terakhir:

  • Seperti yang ditunjukkan oleh Martin Ender, " nmuncul dua kali dalam segitiga Pascal" setara dengan " ntidak muncul di n-1baris pertama ".
  • Kami ingin kembali truejika angkanya bukan bilangan prima (yaitu, ÆP == 0) dan jumlahnya cnol. Dari situ kita dapat menyimpulkan itu ÆP == c.
    Dapat dibuktikan bahwa jika mereka sama, maka mereka sama dengan 0, karena:
    • ÆP mengembalikan nilai boolean, yang hanya bisa 0 atau 1.
    • Jika mengembalikan 1, maka nadalah bilangan prima, karena itu ia tidak dapat muncul di n-1baris pertama (yaitu, c == 0)
pengguna202729
sumber
1bukan prima Pascal; ini katanya.
Jonathan Allan
Ḷc€ḶFċoÆP¬akan bekerja saya pikir.
Jonathan Allan
ċ=ÆPharus bekerja.
Dennis
FYI saya menemukan kelemahan dalam pendekatan saya dan telah menghapusnya.
Jonathan Allan
BTW Ḷcþ`Fċ=ÆPharus bekerja juga.
Tn. Xcoder
4

Haskell , 86 84 byte

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

Cobalah online!

Penjelasan

Fungsi ini psecara rekursif mendefinisikan segitiga Pascal yang merosot:

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

Seperti yang dapat kita lihat (dalam solusi 1ini agak istimewa) setiap angka nmuncul tepat dua kali di n+1baris ke - th dan semua elemen dari baris berikutnya hanya menjadi lebih besar, sehingga kita hanya perlu memeriksa apakah nada suatu tempat hingga nbaris ke - th untuk melihat apakah suatu elemen didiskualifikasi:

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

Sekarang kita memiliki Truesemua elemen yang muncul lebih dari dua kali (kecuali 1), jadi yang kita butuhkan adalah memiliki isPrimefungsi yang salah yang mengembalikan Trueuntuk 1:

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

APL (Dyalog) , 44 34 24 19 byte

5 byte disimpan berkat @Cowsquack

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

Cobalah online!

Bagaimana?

Kami memastikan bahwa keduanya tidak

- berkisar 0.. n-1,

⍳∘.! - Atas binomial cartesian dengan diri

⊢∊- mengandung n,

- juga tidak

⊢|⍨- nmodulo setiap item dari

2↓⍳- jangkauan 2..n-1

~0∊- tidak mengandung 0(alias tidak dapat dibagi)

Uriel
sumber
Mengubahnya menjadi kereta api (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)lebih pendek dua byte
Kritixi Lithos
@Cowsquack hmm Saya tidak melihat itu menjadi sangat pendek sehingga kereta bisa muat (mulai 40 byter). Terima kasih!
Uriel
(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳untuk dua lainnya, saya mengubah algoritma pemeriksaan
keaslian
@Cowsquack oo pintar. Saya belum pernah melihat variasi keutamaan itu sebelumnya
Uriel
Menata ulang ~memberikan (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳satu byte kurang.
Kritixi Lithos
2

JavaScript (Node.js) , 103 101 byte

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)

Cobalah online!

l4m2
sumber
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 berfungsi tetapi sebenarnya untuk rentang kecil
14m2
2

Ruby , 97 95 byte

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

Cobalah online!

Memotong beberapa byte.

Pasang kembali Monica - notmaynard
sumber
2

R , 55 byte

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

Cobalah online!

sum(!n%%1:n)>2adalah tes komposit dan outer(1:n-1,1:n,choose)menghitung baris 0ke n-1segitiga Pascal, jadi kami pastikan ntidak muncul di sana.

Giuseppe
sumber
2

05AB1E , 10 byte

ÝDδcI¢IpÌQ

Cobalah online!

Penjelasan

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

Pemeriksaan yang nterjadi tepat dua kali dalam n pertama + baris segitiga pascals dan tidak prima.
Perbandingan berfungsi karena tidak ada bilangan prima yang dapat terjadi 3 kali dalam segitiga.

Emigna
sumber
1

Haskell , 90 byte

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

Cobalah online!

benar-benar manusiawi
sumber
1

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

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

Cobalah online!

pemeriksa prime jahat +50 byte :(

Shieru Asakoto
sumber
0

Python 2 , 105 104 byte

terima kasih kepada user202729 untuk -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

Cobalah online!

ovs
sumber
Sepasang tanda kurung di sekelilingnya p+rtampak mubazir ...
user202729