ย่อยสลายเป็นจำนวนเฉพาะ


14

กำหนดจำนวนเต็มnส่งคืนจำนวนวิธีที่ n สามารถเขียนเป็นรายการของจำนวนเฉพาะ ยกตัวอย่างเช่น2323สามารถเขียนเป็น(2,3,23), (23,23)หรือ(2,3,2,3)หรือดังนั้นคุณจะเอาท์พุท(23,2,3) หากไม่สามารถเขียนในลักษณะนี้คุณควรเอาท์พุท40

จำนวนเฉพาะเช่น019หรือ00000037เป็นจำนวนเฉพาะที่ถูกต้องสำหรับปัญหานี้

กรณีทดสอบ:

5 -> 1
55 -> 1 
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0 
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)

นี่คือดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาชนะ!

แก้ไข: ตอนนี้ฉันรู้ว่าทำไมฉันควรใช้ sandbox ในครั้งต่อไป


คำตอบ:


7

Haskell , 96 89 ไบต์

บันทึก 5 ไบต์ด้วยการทดสอบแบบดั้งเดิมของ H.PWiz

p x=[1|0<-mod x<$>[2..x]]==[1]
f[]=1
f b=sum[f$drop i b|i<-[1..length b],p$read$take i b]

ลองออนไลน์!

คำอธิบาย

สิ่งแรกที่ทำคือการสร้างฟังก์ชั่นการทดสอบที่สำคัญโดยใช้ทฤษฎีบทของวิลสันโดยใช้ความหมายของนายก

p x=[1|0<-mod x<$>[2..x]]==[1]

fจากนั้นเริ่มต้นกำหนด สิ่งแรกที่ฉันคิดว่าเมื่อฉันเห็นปัญหานี้คือการใช้การเขียนโปรแกรมแบบไดนามิก อย่างไรก็ตามการเขียนโปรแกรมแบบไดนามิกค่าใช้จ่ายไบต์ดังนั้นสิ่งนี้ใช้อัลกอริทึม "การเขียนโปรแกรม psuedo-dynamic" ในขณะที่การเขียนโปรแกรมแบบไดนามิกคุณจะเก็บกราฟ Directed Acyclic ในหน่วยความจำที่นี่เราเพียงแค่ใช้การเรียกซ้ำและคำนวณใหม่แต่ละโหนดทุกครั้งที่เราต้องการ มันเสียประโยชน์ตลอดเวลาของการเขียนโปรแกรมแบบไดนามิก แต่นี่คือดังนั้นใครสนใจ (ยังดีกว่าการค้นหาแบบ brute force)

อัลกอริทึมดังต่อไปนี้เราสร้างกราฟ Acyclic Directed, Lซึ่งแต่ละโหนดแสดงซับสตริงของตัวเลข โดยเฉพาะL iหมายถึงตัวเลขiหลักสุดท้ายของอินพุตของเรา (เรียกว่าn )

เรากำหนดL 0ให้มีค่า 1 และค่าอื่น ๆ ในLเพื่อให้ได้ผลรวมของแต่ละL jเช่นนั้นj <iและซับสตริงของnจากiถึงjเป็นไพรม์

หรือในสูตร:

สูตร

จากนั้นเราจะกลับค่าที่ดัชนีที่ใหญ่ที่สุดที่ใหญ่ที่สุดของL ( L kโดยที่kคือจำนวนหลักของn )


6

เยลลี่ 8 ไบต์

ŒṖḌÆPẠ€S

ลองออนไลน์!

-1 ไบต์ขอบคุณ Leaky Nun
-1 ไบต์ขอบคุณเดนนิส

คำอธิบาย

ŒṖḌÆPẠ€S  Main Link
ŒṖ        List Partitions (automatically converts number to decimal digits)
  Ḍ       Convert back to integers (auto-vectorization)
   ÆP     Are they primes? (auto-vectorization)
     Ạ€   For each, are they all truthy (were the numbers all primes?); 1/0 for truthy/falsy
       S  Sum; gets number of truthy elements

ฉันสังเกตเห็นว่า 05AB1E ไม่สามารถทำได้อย่างง่ายดาย พาร์ติชันดูเหมือนเป็นคำสั่งที่ยอดเยี่ยม
Magic Octopus Urn

5

Brachylogขนาด 10 ไบต์

ṫ{~cịᵐṗᵐ}ᶜ

ลองออนไลน์!

ก่อนอื่นแปลงอินพุตเป็นสตริง นับจำนวนของผลที่เป็นไปได้สำหรับ{…}ᶜ

ภายใน{…}การส่งออกของจะถูกป้อนเข้า ~cเอาต์พุตของเพรดิเคตนี้เป็นไปตามที่พอใจเมื่อตัดแบ่งแล้วเท่ากับอินพุต นี่ถูกป้อนเข้าịᵐซึ่งระบุว่าเอาต์พุตของมันคืออินพุตกับแต่ละสตริงที่แปลงเป็นจำนวนเต็ม ṗᵐระบุว่าการป้อนข้อมูลประกอบด้วยจำนวนเฉพาะ


1
คุณไม่จำเป็นต้องแปลงสตริงและด้านหลังผู้ที่ 7 {~cṗᵐ}ᶜไบต์พอ: สิ่งนี้ช้ามากเพราะ~cในจำนวนเต็มทำงานร่วมกับคณิตศาสตร์แบบ จำกัด แต่ในทางทฤษฎีแล้วมันทำงานได้
ลดขนาด

@ ทำให้ฉันคิดว่าล้มเหลวในการคิดเลขศูนย์สำหรับชั้นนำ
H.PWiz

4

Pyth , 13 ไบต์

lf.AmP_sdT./`

ชุดทดสอบ


ฉันไม่รู้จัก Pyth ที่ดี แต่แทนที่จะกรองแล้วใช้ความยาวคุณช่วย for_each แทน filter แล้วรวมได้ไหม
HyperNeutrino

@HyperNeutrino ทำอะไรได้บ้าง?
Leun Nun

ฉันไม่แน่ใจฉันยังไม่ได้ทดสอบ มันทำเพื่อเยลลี่ (อาจเป็นเพราะตัวกรองแบบสองไบต์อย่างรวดเร็ว) แต่ฉันไม่แน่ใจ
HyperNeutrino

@HyperNeutrino ตัวกรองเป็นหนึ่งไบต์ที่นี่ ...
Leaky Nun


2

Python 2 , 161 ไบต์

lambda n:sum(all(d>1and all(d%i>0for i in range(2,d))for d in v)for v in g(`n`))
g=lambda s:[[int(s[:i])]+t for i in range(1,len(s))for t in g(s[i:])]+[[int(s)]]

ลองออนไลน์!

ฟังก์ชันgสร้างพาร์ติชันแบบเรียกซ้ำ (ใช้สตริงเป็นอินพุต แต่เอาต์พุตรายการรายการ int) รหัสที่เหลือส่วนใหญ่จะใช้เพื่อเป็น 'is dprime?'





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