หมายเลขการละเมิดลิขสิทธิ์


14

Piเป็นจำนวนอตรรกยะซึ่งหมายความว่าการแทนทศนิยมจะไม่สิ้นสุดหรือซ้ำตัวเอง

พี่ตัดออกไป 41 ตัวเลขทศนิยม (40 สถานที่) 3.1415926535897932384626433832795028841971เป็น

หากเราเพิกเฉยกับจุดทศนิยมและแสดงรายการตัวเลขเป็นลำดับของจำนวนเต็มบวกหลีกเลี่ยงการซ้ำเราจะได้3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971( OEIS A064809 )
(การแจ้งให้ทราบที่15ปรากฏในลำดับแทนที่จะเป็น1 5เพราะ1เคยเกิดขึ้นแล้ว
และโปรดทราบว่า0จะไม่เกิดขึ้นเพราะมันไม่ได้เป็นบวก; 950มีศูนย์แรก)

ในการสร้างหมายเลขการละเมิดลิขสิทธิ์ครั้งแรกเราใช้ลำดับนี้เพื่อจัดทำดัชนีเป็นตัวเลขของ Pi (หลักแรกคือ 3, 1 ที่สอง ฯลฯ )

ดังนั้นหลักแรกของหมายเลขการละเมิดลิขสิทธิ์แรกคือหลักที่ 3 ของ Pi
หลักที่สองคือหลักที่ 1 ของ Pi
หลักที่สามคือหลักที่ 4 ของ Pi
ที่สี่คือที่15หลักของ Pi
และอื่น ๆ
จุดทศนิยมจะถูกเพิ่มหลังจากตัวเลขแรกเพื่อเลียนแบบ Pi

ดังนั้นจำนวน pirrational แรกถึง 41 4.3195195867462520687356193644029372991880หลักเป็น
(โปรดทราบว่าสำหรับหลักที่ 30 ฉันต้องไปตลอดทางจนถึงหลักที่ 974 ของ Pi)

เพื่อสร้างหมายเลขการละเมิดลิขสิทธิ์ที่สองกระบวนการจะทำซ้ำโดยใช้หมายเลขการละเมิดลิขสิทธิ์แรกแทน Pi (Pi ตัวเองอาจจะเรียกว่าจำนวน pirrational ข้อที่ศูนย์.) ดังนั้นลำดับใหม่เป็น4 3 1 9 5 19 58 ...และจำนวน piirational 9.14858...แรกคือการจัดทำดัชนีการผลิตที่สองซึ่งจะเริ่มต้น

หมายเลขการละเมิดลิขสิทธิ์เพิ่มเติมจะถูกสร้างขึ้นในลักษณะเดียวกันโดยแต่ละหมายเลขจะถูกสร้างขึ้นจากหมายเลขก่อนหน้า

ท้าทาย

งานของคุณคือการเขียนโปรแกรมที่สั้นที่สุดเท่าที่จะเป็นไปได้โดยใช้จำนวนเต็มสองจำนวนNและDและส่งออกNหมายเลขการละเมิดลิขสิทธิ์ th ให้เป็นDเลขทศนิยม

Dจะเป็นค่าบวกเสมอ แต่Nไม่ใช่ค่าลบและDตัวเลขของ Pi ควรจะถูกส่งออกเมื่อNเป็น 0
เมื่อDเป็น 1 มันไม่สำคัญว่าจะมีจุดทศนิยมหรือไม่

อินพุตควรมาจาก stdin หรือบรรทัดคำสั่งและเอาต์พุตควรไปที่ stdout (หรือตัวเลือกที่ใกล้เคียงที่สุดของภาษาของคุณ)

โปรแกรมของคุณควรทำงานกับค่าอินพุตทั้งหมดNและDต่ำกว่า 2 16แต่ไม่จำเป็นต้องตรงเวลาหรือมีประสิทธิภาพ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

(โปรดทราบว่าหมายเลขการละเมิดลิขสิทธิ์ออกจากฐานอื่น แต่ทุกอย่างในการท้าทายนี้ทำในฐาน 10)


เราสามารถใช้ในตัวการแสดงโดยพลแม่นยำของพี่ที่จะได้รับของตัวเลข?
Martin Ender

1
@ MartinBüttnerแน่นอน คุณยังสามารถรับไพของออนไลน์ได้หากคุณต้องการตราบใดที่คุณได้รับเฉพาะไพของ
งานอดิเรกของ Calvin

@ Calvin'sHobbies: อ่าดีฉันจะมี 64ki หลักแรกของ pi ในไฟล์ได้ไหม? ฉันควรเพิ่ม +1 สำหรับชื่อไฟล์หรือไม่
Claudiu

ช่วงอินพุตนั้นถูกต้องหรือไม่ สำหรับN=1, D=13393ตัวอย่างเช่นคุณจะต้อง 31000000 หลักของ PI
Claudiu

ไพ 1 พันล้านหลักแรกเท่านั้นที่ทำให้คุณได้รับ 42,598 หลักของหมายเลขการละเมิดลิขสิทธิ์ครั้งที่ 1
Claudiu

คำตอบ:


3

Python 292 ไบต์

ไม่มีประสิทธิภาพค่อนข้างฉันได้รับเพียงไม่กี่หลักของ N = 3 และไม่มีของ N = 4

import sympy
def P(N,D,s=''):
 if N<1:return'3'+`sympy.pi.evalf(D+9)`[2:-9]
 for i in range(D):
    h=[];l='';j=i;x=0
    while-~j:
     x+=1;d=P(N-1,x)[-1];l+=d
     while'1'>P(N-1,x+1)[-1]:x+=1;l+='0'
     if(l in h)<1:h+=[l];l='';j-=1
    s+=P(N-1,int(h[i]))[-1]
 return s
s=P(*input())
print s[0]+'.'+s[1:]

ตัวอย่างอินพุต:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815

โรงแรมพร้อมสนามกอล์ฟ: การเปลี่ยนแปลงไป=="0" <"1"ทำด้านในขณะที่วนหนึ่งบรรทัด x += 1ช่องว่างเอาออกรอบ if l not in h-> if(l in h)<1: N==0->N<1
isaacg

@isaacg ขอบคุณสำหรับสิ่งเหล่านี้ฉันรู้สึกเร่งรีบเมื่อฉันโพสต์และคิดถึงบางสิ่งที่ชัดเจน ฉันอาจจะไม่ได้ตระหนักว่าคุณสามารถทำการเปรียบเทียบสตริงได้และif(l in h)<1ก็ค่อนข้างฉลาด
KSab

เพิ่มเติม: เริ่มต้นsเป็นพารามิเตอร์ของP( def P(N,D,s=''):) str(...)สามารถเขียนด้วย backticks ได้ while'1'>...ช่วยประหยัดพื้นที่ ทำให้hชุดและเริ่มต้นด้วยh=l,={''}แล้วเขียนเป็นl in h {l}<h
flornquake

@ flornquake นั่นฉลาดทีเดียวโดยเฉพาะอย่างยิ่งวิธีการเริ่มต้นของมันดังนั้นงูใหญ่ไม่คิดว่ามันเป็นพจน์ ในขณะที่ฉันกำลังทำสิ่งนี้อยู่ฉันได้ตระหนักถึงการเพิ่มประสิทธิภาพที่ค่อนข้างใหญ่ซึ่งน่าเสียดายที่ต้องhมีการสั่งซื้อ ถึงกระนั้นนั่นก็เป็นกลลวงที่เรียบร้อยฉันจะพยายามจำ
KSab

@KSab ดีกว่านี้อีก :) while j+1:สามารถย่อให้เหลือwhile-~jbtw
flornquake

4

Haskell, 431 400 369

import Data.List
g(q,r,t,k,n,l)|4*q+r-t<n*t=n:g(q#0,(r-n*t)#0,t,k,div(r#(30*q))t-n#0,l)|1<2=g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
u w@(x:y:xs)=x:v y xs 0 w
v a(r:s)n w|a`elem`take n(u w)||r==0=v(a#r)s n w|1<2=a:v r s(n+1)w
m p=map(genericIndex p.pred)$u p
a#b=a*10+b
(x:s)%n=show x++'.':show(foldl1(#)$n`take`s)
f n d=print$iterate m(g(1,0,1,1,3,3))!!n%d

ต้องรักรายการอนันต์! ด้วยเวลาและหน่วยความจำที่เพียงพอโปรแกรมนี้จะคำนวณคำตอบที่เหมาะสมสำหรับ N และ D ใด ๆ (ฉันถือว่า)

ฉันสร้างตัวเลขของปี่กับgการใช้อัลกอริทึมหัวจุก (ขโมยลงคอจากผู้ชายที่เรียกว่าสแตนลี่ย์ราบิโนวิ), การจัดกลุ่มตัวเลข / สร้างลำดับการใช้vและสร้างจำนวน pirrational mจากเหล่านี้โดยใช้

นี่คือการกระทำ:

λ> f 0 10
"3.1415926535"
λ> f 1 10
"4.3195195867"
λ> f 2 10
"9.Interrupted. --didn't have the time to wait for this to finish
λ> f 2 4
"9.1485"

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