มันเป็น Pascal Prime หรือไม่?


18

เป็นที่ทราบกันดีว่าช่วงเวลาแปลก ๆ จะปรากฏในรูปสามเหลี่ยมของ Pascal สองครั้งอย่างแน่นอน อย่างไรก็ตามตัวเลขทั้งหมดที่ปรากฏในรูปสามเหลี่ยมของ Pascal นั้นไม่ใช่ตัวเลขทั้งหมดเท่านั้น เราจะเรียกตัวเลขเหล่านี้ Pascal primes

Pascal primes เป็นตัวเลขประกอบที่ปรากฏขึ้นเป็นสองเท่าในรูปสามเหลี่ยมของ Pascal ช่วงเวลาไม่กี่ปาสกาลแรกคือ

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

ความท้าทายของคุณคือการใช้จำนวนเต็มบวกnเป็นอินพุตและเอาต์พุตจริงหรือเท็จขึ้นอยู่กับว่าnเป็น Pascal prime หรือไม่ นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดชนะ!



2
เราสามารถแสดงผล True ได้หรือไม่ถ้าไม่ใช่ Pascal prime และ false ถ้าใช่
caird coinheringaahing

ลำดับนี้เป็นOEIS ลำดับ A002808 's ตัดกับOEIS ลำดับ A137905
มนุษย์โดยรวม

@cairdcoinheringaahing ไม่ต้องอยู่ในข้อกำหนดที่กำหนด
ศิลปะที่สวยงามเรียบง่าย

ฉันประหลาดใจที่ไม่มีใครโพสต์คำตอบใน Pascal ฉันจะถ้าฉันได้รับเวลา (และถ้าฉันสามารถหาคอมไพเลอร์ปาสคาลเก่าของฉัน)
manassehkatz-Reinstate โมนิก้า

คำตอบ:


10

ภาษา Wolfram (Mathematica)ขนาด 45 ไบต์

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

ลองออนไลน์!

ทุกหมายเลขคอมโพสิตnปรากฏขึ้นสองครั้งที่แถวnและไม่สามารถปรากฏหลังจากนั้น ดังนั้นเงื่อนไขสำหรับช่วงเวลา Pascal ก็คือมันจะไม่ปรากฏเลยภายในแถวn-1แรก

เท่าที่ฉันสามารถบอกได้ว่ามันสั้นกว่าการตรวจสอบว่ามันปรากฏขึ้นสองครั้งภายในnแถวแรกและสามารถใช้!PrimeQแทนได้


4

Python 2 , 93 ไบต์

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

ลองออนไลน์!

นี้เป็นฟังก์ชั่นชื่อซึ่งเอาท์พุทผ่านรหัสทางออก , 0สำหรับ Pascal Primes, 1มิฉะนั้น

มันทำงานอย่างไร

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.

โดยทั่วไปจะตรวจสอบว่ามีnเกิดขึ้นในn - 1 แรกหรือไม่แถวแรกของสามเหลี่ยมปาสกาลหรือไม่หรือมันเป็นไพรม์และจะเกิดข้อผิดพลาดหากตรงตามเงื่อนไขสองข้อนี้

ที่บันทึกไว้ 1 ไบต์ขอบคุณที่OVS



@ovs: o ฉลาดจัง! ขอบคุณ
นาย Xcoder

4

เยลลี่ , 11 10 9 ไบต์

ขอบคุณที่:

  • Martin Ender สำหรับ -1 ไบต์! (วิธีอื่นใช้(+1) หลีกเลี่ยงการใช้n2(-2) ดังนั้น -1 โดยรวม
  • Jonathan Allanสำหรับการแก้ไขข้อผิดพลาด
  • เดนนิสอีก -1 ไบต์
Ḷc€ḶFċ=ÆP

ลองออนไลน์!

วิธีทางเลือกโดยโจนาธานอัลลัน (มีข้อบกพร่อง)

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

คำอธิบายสำหรับบรรทัดสุดท้าย:

  • ดังที่มาร์ตินเอนเดอร์ชี้ " nปรากฏสองครั้งในสามเหลี่ยมปาสคาล" เทียบเท่ากับ " nไม่ปรากฏในn-1แถวแรก"
  • เราต้องการคืนค่าtrueถ้าจำนวนนั้นไม่ใช่จำนวนเฉพาะ (นั่นคือÆP == 0) และจำนวนcนั้นเป็นศูนย์ ÆP == cจากการที่เราสามารถอนุมานได้ว่า
    มันสามารถพิสูจน์ได้ว่าถ้าพวกเขาเท่ากันพวกเขาจะเท่ากับ 0 เพราะ:
    • ÆP ส่งคืนค่าบูลีนซึ่งสามารถเป็น 0 หรือ 1 เท่านั้น
    • หากมันคืนค่า 1 nจะเป็นจำนวนเฉพาะดังนั้นจะไม่ปรากฏในn-1บรรทัดแรก(นั่นคือc == 0)

1ไม่ใช่ Pascal prime; มันบอกว่ามันคือ
Jonathan Allan

Ḷc€ḶFċoÆP¬ฉันจะทำงาน
Jonathan Allan

ċ=ÆPควรทำงาน.
Dennis

FYI ฉันพบข้อบกพร่องในวิธีการของฉันและได้ลบมัน
Jonathan Allan

BTW Ḷcþ`Fċ=ÆPควรทำงานด้วย
Mr. Xcoder

4

Haskell , 86 84 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ฟังก์ชั่นpซ้ำกำหนดรูปสามเหลี่ยมของ Pascal ที่แย่ลง:

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

ดังที่เราเห็น (ในโซลูชัน1นี้ค่อนข้างพิเศษ) ทุก ๆ ตัวเลขnจะปรากฏขึ้นสองครั้งในn+1แถวที่สองและองค์ประกอบทั้งหมดของแถวที่ตามมาจะใหญ่ขึ้นเท่านั้นดังนั้นเราต้องตรวจสอบว่าnอยู่nแถวใดแถวหนึ่งเพื่อดูว่า องค์ประกอบถูกตัดสิทธิ์:

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

ตอนนี้เรามีTrueองค์ประกอบทั้งหมดที่ปรากฏมากขึ้นกว่าสองเท่า (ยกเว้น1) ดังนั้นสิ่งที่เราต้องการคือการมีความผิดพลาดของisPrimeฟังก์ชั่นที่ให้ผลตอบแทนTrueสำหรับ1:

all((>0).rem n)[2..n-1]

4

APL (Dyalog) , 44 34 24 19 ไบต์

บันทึก 5 ไบต์ด้วย @Cowsquack

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

ลองออนไลน์!

อย่างไร?

เราตรวจสอบให้แน่ใจว่าไม่มี

- ช่วง0.. n-1,

⍳∘.! - บนคาร์ทีเซียนทวินามด้วยตนเอง

⊢∊- มีn,

- และไม่

⊢|⍨- nmodulo แต่ละรายการของ

2↓⍳- ช่วง2..n-1

~0∊- ไม่ประกอบด้วย0(aka ไม่สามารถหารได้)


การแปลงเป็นรถไฟ(∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)จะสั้นลงสองไบต์
Kritixi Lithos

@ Cowquack อืมฉันไม่ได้สังเกตว่ามันสั้นมากจนรถไฟพอดี (เริ่ม 40 byter) ขอบคุณ!
Uriel

(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳สำหรับอีกสองฉันเปลี่ยนขั้นตอนวิธีการตรวจสอบแบบ
ดั้งเดิม

@Cowsquack oo ฉลาด ฉันไม่เคยเห็นการเปลี่ยนแปลงแบบดั้งเดิมมาก่อน
Uriel

จัดเรียงการ~ให้ใหม่(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳สำหรับหนึ่งไบต์ที่น้อยกว่า
Kritixi Lithos

2

JavaScript (Node.js) , 103 101 ไบต์

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)

ลองออนไลน์!


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 ใช้งานได้ แต่ในความเป็นจริงสำหรับช่วงขนาดเล็ก
l4m2


2

R , 55 ไบต์

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

ลองออนไลน์!

sum(!n%%1:n)>2เป็นการทดสอบคอมโพสิตและouter(1:n-1,1:n,choose)คำนวณแถว0ถึงn-1ของสามเหลี่ยมของ Pascal ดังนั้นเราจึงแน่ใจว่าnจะไม่ปรากฏที่นั่น


2

05AB1E , 10 ไบต์

ÝDδcI¢IpÌQ

ลองออนไลน์!

คำอธิบาย

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

การตรวจสอบที่nเกิดขึ้นสองครั้งในn + 1แถวแรกของสามเหลี่ยมปาสคาลและไม่ดีเท่า
การเปรียบเทียบใช้งานได้เนื่องจากไม่มีช่วงเวลาที่สามารถเกิดขึ้นได้ 3 ครั้งในสามเหลี่ยม





โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.