ค้นหาช่วงเวลาใน Pi


30

เวลามีอยู่ทุกหนทุกแห่ง ...

พวกเขาซ่อนตัวอยู่ใน Pi

3.141592653 58979 3238 462643 3832 795028841 971693993751

มารับช่วงเวลาเหล่านั้น!

ความท้าทาย

ให้เป็นอินพุทเป็นจำนวนเต็มn>0ค้นหาว่ามีจำนวนเฉพาะซ่อนอยู่ภายในnตัวเลขแรกของPi

ตัวอย่าง

สำหรับเราควรจะค้นหาเฉพาะในn=3 [3,1,4]มี 2 ​​ช่วงเวลา(3,31)ดังนั้นรหัสของคุณควรส่งออก2
สำหรับn=1010 หลักแรกคือ[3,1,4,1,5,9,2,6,5,3]และรหัสของคุณควรส่งออก12เพราะ[2, 3, 5, 31, 41, 53, 59, 653, 4159, 14159, 314159, 1592653]ถูกซ่อนอยู่ (และพบ!)

กรณีทดสอบ

อินพุต -> เอาต์พุต

1->1  
3->2  
13->14  
22->28  
42->60  
50->93

150->197  
250->363  
500->895

กฎระเบียบ

รหัสของคุณจะต้องสามารถค้นหาช่วงเวลาทั้งหมดอย่างน้อยn=50
ใช่คุณสามารถhardcode 50 หลักแรกของPiถ้าคุณชอบ
รายการรหัสคำตอบที่ไม่ถูกต้อง

นี่คือคำตอบที่สั้นที่สุดเป็นไบต์ชนะ!


6
"คุณสามารถ hardcode 50 หลักแรกของพี่ถ้าคุณต้องการ" แก้ไขปัญหาแรกแล้ว! ตอนนี้สำหรับการทดสอบแบบดั้งเดิมของกอล์ฟที่มีจำนวนเต็มสูงสุด 50 หลัก ... O_o (นี่เป็นความท้าทายที่ดี แต่อาจต้องใช้ตัวสร้างคณิตศาสตร์หรือห้องสมุดที่มั่นคง)
Arnauld

3
@tallyallyhuman ลำดับนั้นไม่ได้อยู่ใน OEIS เลย! ถึงเวลาที่คุณจะได้รับชื่อเสียง?
Sanchises

3
IMO ที่อนุญาตให้เข้ารหัส 50 ค่าแรกนั้นเป็นอันตรายต่อความท้าทายนี้ ความท้าทายนี้มีสองส่วนคือ 1) พยายามบีบอัดค่า 50 อันดับแรกหรือ 2) ทำการท้าทายจริง
JAD

2
โดยทั่วไปจะอยู่ในประเภทของความท้าทายซึ่งการคำนวณจะหนักขึ้น / ช้าลง / ต้องใช้หน่วยความจำมากมันก็เพียงพอแล้วที่โปรแกรมจะทำงานในเชิงทฤษฎีแทนที่จะตั้งค่าการตัดโดยพลการและอนุญาตการเข้ารหัส
JAD

3
@BillSteihn การอัปเดตกฎหลังจากมีคำตอบหลายข้อขัดต่อจิตวิญญาณของเว็บไซต์นี้ คุณโพสต์คำถามนี้ในแซนด์บ็อกซ์หรือไม่? คุณจะได้รับข้อเสนอแนะก่อนเวลาจริง ๆ ว่าคำตอบที่ hardcoded จะเข้ามา
Olivier Grégoire

คำตอบ:


20

05AB1E ,  10  8 ไบต์

-2 ไบต์ขอบคุณ Adnan ( pเวกเตอร์)

<žsþŒÙpO

ลองออนไลน์! (จะทำงานได้ถึง n = 98413 แต่จะช้ามากแม้สำหรับ n = 50 เนื่องจากจำเป็นต้องทดสอบจำนวนมากสำหรับการใช้งานดั้งเดิม - TIO หมดเวลาที่ 60 วินาทีสำหรับ n = 50)

อย่างไร?

<žsþŒÙpO - implicitly push input, n
<        - decrement = n-1
 žs      - pi to that many decimal places (i.e. to n digits)
   þ     - only the digits (get rid of the decimal point)
    Π   - all sublists
     Ù   - unique values
      p  - is prime? (vectorises) 1 if so, 0 otherwise
       O - sum
         - implicitly print the top of the stack

<žsþŒÙpOควรทำงานได้ 8 ไบต์
Adnan

อาใช่แล้วpเวกเตอร์ขอบคุณ!
Jonathan Allan

2
ใช่ ในที่สุดคำตอบกอล์ฟสั้น ๆ ที่ฉันเข้าใจจริงๆ! : D
Fabian Röling

11

Mathematica, 76 ไบต์

Tr[1^Union@Select[FromDigits/@Subsequences@#&@@RealDigits[Pi,10,#],PrimeQ]]&

โอ้ไม่ยุติธรรมฉันไม่คุ้นเคยกับ Mathematica golf : P (+1)
สิ้นเชิงมนุษย์

@tallyallyhuman เราโพสต์สิ่งนี้ในเวลาเดียวกัน มันแปลกมาก!
J42161217

ฉันเล่นกอล์ฟคำตอบของฉันโดยใช้เทคนิคการสร้างประโยค แต่ฉันก็ยังคงฟังก์ชั่นที่ฉันเคยใช้ ฉันหวังว่าคุณจะไม่รังเกียจ
มนุษย์โดยรวม

Tr[1^...]นั่นเป็นวิธีที่ฉลาดในการค้นหาความยาวของรายการดี!
numbermaniac

6

Mathematica, 104 97 90 ไบต์

Length@DeleteDuplicates@Select[FromDigits/@Subsequences@First@RealDigits[Pi,10,#],PrimeQ]&

ฮ่าฮ่าฮ่าฮ่าฉันจัดการทำให้มันสำเร็จ ฉันไม่รู้ว่าจะใช้ Mathematica อย่างไร XD

การป้อนข้อมูล:

[50]

1
คุณโพสต์บางวินาทีข้างหน้าของฉัน และคำตอบของเราเหมือนกันมาก! +1
J42161217

คุณแน่ใจเกี่ยวกับตัวเลขที่คุณเพิ่งโพสต์ (ตรวจสอบการปัดเศษของตัวเลข) ฉันเห็นผลลัพธ์ที่แตกต่างกันเล็กน้อยโดยใช้ Python และ sympy
Jonathan Allan

@JonathanAllan 50 96OP บอกว่า 50 หลักมี 93 ครั้งดังนั้นความแม่นยำของ Sympy จึงอาจปิด ..
มนุษย์โดยรวม

@JonathanAllan Sympy ใช้การทดสอบความน่าจะเป็นหรือน่าจะเป็นสิ่งที่กำหนดหรือไม่? (คำถามเดียวกันสำหรับ PrimeQ ของ Mathematica)
Arnauld

@Arnauld จุดที่ดีไม่แน่ใจ
Jonathan Allan

3

Python 3 , 274 237 207 194 189 ไบต์

-37 ไบต์ขอบคุณที่ช่วยสร้างข้าวสาลี! -14 ไบต์ขอบคุณ Mr.Xcoder

ฮาร์ดโค้ด 50 หลักแรกของpiแต่คำนวณทุกอย่างด้วยตนเอง

x=int(input());l="31415926535897932384626433832795028841971693993751"[:x]
print(sum(all(i%m for m in range(2,i))for i in{int(i)for w in range(x)for i in[l[j:j-~w]for j in range(x-w)]}-{1}))

ลองออนไลน์!



l=list("31415...)ควรบันทึก ~ 40 ตัวอักษร และการเปลี่ยนแปลงที่ช่วยให้คุณเปลี่ยนที่มีเพียงmap(str,i) i
AShelly


195 ไบต์โดยการลบรหัสแปลก ๆ
Mr. Xcoder

194 bytesโดยการประกาศlen(l)
Mr. Xcoder

1

R, 156 123 ไบต์

cat(cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))[scan()])

ทางออกที่น่าสนใจสุด ๆ ทำงานกับคนที่เหมาะสม

บันทึกแล้ว 33 ไบต์ขอบคุณ @Giuseppe

R (+ ตัวเลขและ gmp), 198 ไบต์

function(n,x=unique(gmp::as.bigz(unlist(sapply(1:n,function(x)substring(gsub("[.]","",numbers::dropletPi(50)),x,x:n))))))min(length(x),sum(sapply(sapply(x[x>0&!is.na(x)],gmp::factorize),length)==1))

ทางออกที่เหมาะสม ใช้เวลาnเป็นอินพุต

ใช้numbers::dropletPi(50)เพื่อสร้างทศนิยม 50 ตำแหน่งแรกของ pi gsubลบจุดทศนิยม substringใช้ทุกสตริงย่อยที่เป็นไปได้ (ความประหลาดใจที่น่าประหลาดใจ) ของ pi ถึงnของปี่ถึง

รายการที่ส่งคืนจะถูกทำให้แบนและแปลงgmpเป็นbigzรูปแบบของ รูปแบบนี้จำเป็นต้องมีเพื่อเก็บจำนวนเต็มความยาว 50 uniqueใช้ค่าที่ไม่ซ้ำกันของเวกเตอร์นั้น xผลที่ได้นี้ได้รับการจัดเก็บไว้ใน

จากนั้นเราตรวจสอบความเป็นอันดับหนึ่ง นี่เป็นเรื่องยุ่งยากเพราะมีกลุ่มคดีขอบและสิ่งที่น่ารำคาญ:

  • สำหรับระดับสูงnนั้นมีหน่วยเป็น0ปี่ สิ่งนี้นำไปสู่สตริงย่อยที่มีศูนย์นำ as.bigzผลิตNAด้วยสิ่งที่จะต้องถูกลบออก

  • ในโน้ตที่คล้ายกันสตริงย่อย"0"จะผิดพลาดgmp::factorizeดังนั้นจึงต้องถูกลบเช่นกัน

  • สำหรับn=1, x = 3. ซึ่งในตัวมันเองก็โอเค แต่bigzเป็นตัวแทนของ3iterable ดังนั้นsapplyจะได้รับความสับสนและรายงาน 16 ครั้ง ด้วยเหตุนี้เราจึงใช้ความยาวขั้นต่ำของเวกเตอร์xและจำนวนของจำนวนเฉพาะในนั้น

  • gmp::isprimeดูเหมือนจะไม่สามารถจัดการกับตัวเลขขนาดใหญ่ได้อย่างน่าเชื่อถือ ดังนั้นเราจึงใช้gmp::factorizeและตรวจสอบความยาวของเอาต์พุตเป็น 1

ดังนั้นในทุกเราลบ0และจากNA xเราแยกตัวประกอบทั้งหมดxและตรวจสอบความยาว เรานับจำนวนของการเกิดขึ้นของและคืน1min(occurences, length(x))


นั่นแหละ! ทีนี้มาดูกันว่ามีใครบางคนที่อยู่ข้างนอกสามารถเอาชนะสิ่งนี้ด้วยวิธีแก้ปัญหาที่น่าสนใจมากกว่านี้ได้ไหม อาจเป็นคุณ!

ใช้cumsum(c(1,1,0,1,1,4,1,0,0,3,0,0,2,7,3,1,0,3,0,0,0,0,0,0,4,1,0,6,0,3,2,0,0,0,0,0,0,4,3,3,6,0,4,8,2,5,3,6,0,5))แทนเวกเตอร์ของคุณ 123 ไบต์ :)
Giuseppe

@Giuseppe นิสัยดี 'การบีบอัด' นั้นจะเอาชนะโซลูชันที่ถูกต้องแน่นอน
JAD

ฉันคิดว่ามันเป็นไปไม่ได้ใน R โดยไม่มีการเข้ารหัสหรือแนะนำแพ็กเกจอื่นเนื่องจาก R มีเพียง 32 บิตซึ่งจะไม่แสดงจำนวนเต็ม 50 หลักอย่างแน่นอน
Giuseppe

1
ใช่ฉันอาจคิดเกี่ยวกับสิ่งนี้อีกเช่นกัน 82 ไบต์ hardcoded
จูเซปเป้

0

เยลลี่ , 59 32 ไบต์

-27 ไบต์ขอบคุณ Erik the Outgolfer

“!⁶⁷¬,6½ạEC.wʠ€Ẉ!+Ẉfṭ¡’Ṿḣ³ẆVQÆPS

ลองออนไลน์!

คำอธิบาย

“...’Ṿḣ³ẆVQÆPS

“...’           compressed string that evaluates to first 50 digits of pi (314159...)
     Ṿ          uneval; stringify
      ḣ³        first n characters of the string where n is the first command-line argument
        Ẇ       all sublists
         V      convert all elements to integers
          Q     deduplicate
           ÆP   convert all prime elements to 1 and others to 0
             S  sum

ทำไมคุณสแปมด้วยคำตอบ
Zacharý

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