Số vi phạm


14

Pi là một số vô tỷ , có nghĩa là biểu diễn thập phân của nó không bao giờ chấm dứt hoặc lặp lại chính nó.

Pi rút ngắn thành 41 chữ số thập phân (40 vị trí) là 3.1415926535897932384626433832795028841971.

Nếu chúng ta bỏ qua dấu thập phân và liệt kê các chữ số dưới dạng một chuỗi các số nguyên dương, tránh trùng lặp , chúng ta sẽ nhận được 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 ).
(Lưu ý rằng 15xuất hiện trong chuỗi thay 1 5vì vì 1đã xảy ra.
Cũng lưu ý rằng điều 0đó không xảy ra vì nó không tích cực; 950chứa số 0 đầu tiên.)

Để xây dựng đầu tiên số pirrational chúng tôi sử dụng chuỗi này để chỉ số vào các chữ số của Pi (chữ số đầu tiên là 3, thứ hai 1, vv).

Vì vậy, chữ số đầu tiên của số vi phạm bản quyền đầu tiên là chữ số thứ 3 của Pi,
chữ số thứ hai là chữ số thứ nhất của Pi,
chữ số thứ ba là chữ số thứ 4 của Pi, chữ số
thứ tư là chữ số thứ 15 của Pi,
v.v.
Một dấu thập phân được thêm vào sau chữ số đầu tiên để bắt chước Pi.

Do đó, số vi phạm bản quyền đầu tiên đến 41 chữ số là 4.3195195867462520687356193644029372991880.
(Lưu ý rằng đối với chữ số thứ 30, tôi phải chuyển sang chữ số thứ 974 của Pi.)

Để xây dựng số bản quyền thứ hai, quy trình được lặp lại bằng cách sử dụng số bản quyền đầu tiên thay vì số Pi. (Bản thân Pi có thể được gọi là số lậu zeroth.) Vì vậy, chuỗi mới là 4 3 1 9 5 19 58 ...và số piiratic đầu tiên được lập chỉ mục để tạo ra số thứ hai, bắt đầu 9.14858....

Các số vi phạm bản quyền hơn nữa được tạo theo cùng một cách, mỗi số được tạo từ số trước.

Thử thách

Nhiệm vụ của bạn là viết chương trình ngắn nhất có thể mà mất trong hai số nguyên, ND, và kết quả đầu ra các Nsố pirrational thứ cắt ngắn để Dthập phân chữ số.

Dluôn luôn dương nhưng Nkhông âm và các Dchữ số của Pi phải là đầu ra khi bằng N0.
Khi Dlà 1, không có vấn đề gì nếu dấu thập phân có mặt hay không.

Đầu vào phải đến từ stdin hoặc dòng lệnh và đầu ra sẽ đi đến thiết bị xuất chuẩn (hoặc các lựa chọn thay thế gần nhất với ngôn ngữ của bạn).

Chương trình của bạn sẽ hoạt động cho tất cả các giá trị đầu vào từ NDdưới 2 16 , nhưng nó không cần phải kịp thời hoặc hiệu quả.

Mã ngắn nhất tính bằng byte thắng.

(Lưu ý rằng số vi phạm bản quyền thoát ra trong các căn cứ khác nhưng mọi thứ trong thử thách này được thực hiện ở cơ sở 10.)


Chúng ta có thể sử dụng các biểu diễn chính xác tùy ý của Pi để lấy các chữ số của nó không?
Martin Ender

1
@ MartinBüttner Chắc chắn. Bạn thậm chí có thể nhận được các chữ số của pi trực tuyến nếu bạn muốn miễn là bạn chỉ nhận được các chữ số của pi.
Sở thích của Calvin

@ Calvin'sHob sở thích: Ah thật tuyệt để tôi có thể có 64 chữ số pi đầu tiên trong một tệp? Tôi có nên thêm +1 cho tên tệp không?
Claudiu

Là phạm vi đầu vào chính xác? Đối với N=1, D=13393ví dụ, bạn sẽ cần các chữ số 31 triệu của PI
Claudiu

1 tỷ chữ số đầu tiên của số pi chỉ giúp bạn có được 42.598 chữ số của số vi phạm bản quyền số 1
Claudiu

Câu trả lời:


3

Python 292 byte

Khá kém hiệu quả, tôi chỉ có thể nhận được một vài chữ số N = 3 và không có 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:]

Đầu vào mẫu:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815

Golf: Thay đổi =="0"thành <"1". Làm cho bên trong vòng lặp một dòng. Xóa không gian xung quanh x += 1. if l not in h-> if(l in h)<1: N==0->N<1
isaacg

@isaacg Cảm ơn vì những điều đó, tôi đã hơi vội vàng khi đăng bài và bỏ lỡ một số điều rõ ràng. Tôi có lẽ sẽ không nhận ra bạn có thể thực hiện so sánh chuỗi và điều if(l in h)<1này cũng khá thông minh.
KSab

Một số chi tiết: Khởi tạo snhư một tham số của P( def P(N,D,s=''):). str(...)có lẽ có thể được viết với backticks. while'1'>...tiết kiệm không gian. Tạo hmột bộ và khởi tạo với h=l,={''}, sau đó viết l in hdưới dạng {l}<h.
flornquake

@flornquake Điều đó khá thông minh, đặc biệt là cách bạn khởi tạo nó để python không nghĩ đó là một lệnh. Khi tôi đặt điều này vào mặc dù, tôi nhận ra một tối ưu hóa khá lớn mà không may phải hđặt hàng. Tuy nhiên, đó là một mẹo gọn gàng tôi sẽ thử và nhớ.
KSab

@KSab Điều đó thậm chí còn tốt hơn. :) while j+1:có thể rút ngắn thành while-~j, btw.
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

Danh sách tình yêu vô hạn! Cho đủ thời gian và bộ nhớ, chương trình này cuối cùng sẽ tính toán câu trả lời đúng cho bất kỳ N và D nào (tôi giả sử).

Tôi đang tạo ra các chữ số pi bằng gcách sử dụng thuật toán spigot (bị đánh cắp một cách đáng xấu hổ từ một kẻ tên là Stanley Rabinowitz), nhóm các chữ số / tạo chuỗi bằng cách sử dụng vvà tạo ra một số lậu từ những người này bằng cách sử dụng m.

Đây là hành động:

λ> 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
Tôi nghĩ "Haskell!" Khi tôi thấy câu hỏi, cuộn xuống và mỉm cười.
Soham Chowdhury
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.