해적 수


14

Pi비이성적 인 숫자로 , 10 진수 표현은 절대 종료되거나 반복되지 않습니다.

소수점 이하 41 자리 (40 자리)로 잘린 Pi는 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대신 순서로 나타나는 통지입니다 . 또한 양수가 아니기 때문에 발생하지 않습니다 . 첫 번째 0을 포함합니다.)1 51
0950

첫 번째 해적 수 를 구성 하기 위해이 시퀀스를 사용하여 Pi의 숫자 (첫 번째 숫자는 3, 두 번째 1 등)로 색인합니다.

따라서 첫 번째 해적 수의 첫 번째 숫자는 Pi의 세 번째 숫자이고
, 두 번째 숫자는 Pi의 첫 번째 숫자이며,
세 번째 숫자는 Pi
의 네 번째 숫자이며, 네 번째 숫자는 Pi 의 다섯 번째 숫자입니다
.
소수점을 첫 번째 숫자 뒤에 추가하여 Pi를 모방합니다.

따라서 첫 번째 해적 수는 41 자리입니다 4.3195195867462520687356193644029372991880.
(30 번째 자리의 경우 Pi의 974 번째 자리까지 가야했습니다.)

제 2 해적 수를 구성하기 위해, Pi 대신 제 1 해적 수를 사용하여 프로세스가 반복된다. (Pi 자체는 제로 해적 수라고 불릴 수 있습니다.) 따라서 새로운 시퀀스는 4 3 1 9 5 19 58 ...첫 번째 해적 숫자가 인덱스되어 두 번째를 생성하여 시작됩니다 9.14858....

추가의 해적 수는 동일한 방식으로 생성되며, 각각은 이전의 것에서 생성됩니다.

도전

당신의 작업은 두 개의 정수를 사용 N하여 가능한 가장 짧은 프로그램을 작성하는 것입니다. 그리고 는 소수점 이하 자릿수 를 10 진수로 D출력합니다 .ND

D항상 양수이지만 N음수이며 D때 파이 자리 출력되어야 N0 인
경우 D는 소수점 존재 여부를 중요하지 않는 경우 인 1이다.

입력은 stdin 또는 명령 행에서 가져와야하며 출력은 stdout (또는 사용자의 언어에서 가장 가까운 대안)으로 이동해야합니다.

여러분의 프로그램은 모든 입력 값에 대한 작업을해야 N하고 D2 이하 16 만 적시 또는 효율적으로 할 필요는 없다.

바이트 단위 의 가장 짧은 코드 이깁니다.

(해적 숫자는 다른 기지에서 빠져 나오지만이 과제의 모든 것은 10 진수로 이루어집니다.)


Pi의 내장 임의 정밀도 표현을 사용 하여 숫자 를 얻을 수 있습니까?
마틴 엔더

1
@ MartinBüttner는 물론이다. pi의 숫자 얻는 한 원하는 경우 pi의 숫자를 온라인으로 가져올 수도 있습니다 .
Calvin 's Hobbies

@ Calvin'sHobbies : 아 파일에 파일의 첫 64ki 자릿수를 가질 수 있습니까? 파일 이름에 +1을 추가해야합니까?
Claudiu

입력 범위가 정확합니까? 의 경우 N=1, D=13393예를 들어, 당신은 PI의 31 만 번째 자리 필요할 것
Claudiu

pi의 처음 10 억 자릿수는 첫 번째 해적 수의 42,598 자릿수
Claudiu

답변:


3

파이썬 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". 내부 while 루프를 한 줄로 만듭니다. 주위의 공백을 제거하십시오 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의 매개 변수로 초기화하십시오 . 아마도 백틱으로 쓸 수 있습니다. 공간을 절약합니다. 확인 세트와 함께 초기화 후 쓰기 로 . Pdef P(N,D,s=''):str(...)while'1'>...hh=l,={''}l in h{l}<h
flornquake

@flornquake 그것은 매우 영리합니다. 특히 파이썬을 초기화하는 방식은 파이썬이 그 dict를 생각하지 않습니다. 나는 이것을 넣을 때 불행히도 h주문이 필요한 상당히 큰 최적화를 실현했습니다 . 아직도, 그것은 시도하고 기억할 깔끔한 트릭입니다.
KSab

@KSab 더 좋습니다. :) while j+1:while-~jbtw 로 단축 될 수 있습니다 .
flornquake

4

하스켈, 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에 대한 정답을 계산합니다 (나는 가정합니다).

나는 스피 곳 알고리즘 (Stanley Rabinowitz라는 사람 에게서 훔치지 않은 ) 을 g사용하여 pi의 숫자를 생성하고, 숫자를 그룹화 / 사용하여 시퀀스를 생성하고 이들을 사용하여 해적 수를 생성합니다 .vm

여기 실제로 작동합니다.

λ> 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
"하스켈!" 내가 그 질문을보고, 아래로 스크롤하고, 웃으면 서
Soham Chowdhury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.