海賊番号


14

Pi無理数です。つまり、その10進表現は終了したり繰り返されたりすることはありません。

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 971OEIS A064809)が得られます。
(すでに発生したためでは15なく、シーケンスに表示される通知。 また、正でないため発生しないことに注意してください。最初のゼロが含まれています。)1 51
0950

最初の著作数を作成するには、このシーケンスを使用してPiの数字にインデックスを付けます(最初の数字は3、2番目の数字は1など)。

したがって、最初の著作権侵害番号の1桁目はPiの3桁目
、2桁目はPiの1桁目
、3桁目はPiの4桁目、4桁目はPi
15桁目など
です。
Piを模倣するために、最初の桁の後に小数点が追加されます。

したがって、41桁の最初の著作権侵害番号は4.3195195867462520687356193644029372991880です。
(30桁目では、Piの974桁目まで行かなければならなかったことに注意してください。)

2番目の著作権数を作成するには、Piの代わりに最初の著作権数を使用してプロセスを繰り返します。(Pi自体は0番目の海賊番号と呼ばれる場合があります。)したがって、新しいシーケンスはで4 3 1 9 5 19 58 ...あり、最初の海賊番号は2番目を生成するためにインデックス付けされます9.14858...

同様の方法で追加の著作権侵害番号が作成され、それぞれ前の番号から生成されます。

チャレンジ

あなたの仕事は、2つの整数を取り、可能な限り最短のプログラムを作成することです。NそしてD、10進N数に切り捨てられたthの実数を出力しDます。

Dは常に正ですがN、負ではなくD、Piの数字Nは0の
ときに出力される必要がありますD。1の場合、小数点が存在するかどうかは関係ありません。

入力はstdinまたはコマンドラインから取得し、出力はstdout(または言語の最も近い代替)に送信する必要があります。

プログラムは2 16以下のすべての入力値で動作するはずですがN、タイムリーまたは効率的である必要はありません。D

バイト単位の最短コードが優先されます

(違法コピー数は他のベースで終了しますが、このチャレンジのすべてはベース10で行われます。)


Piの組み込みの任意精度表現を使用して数字を取得できますか?
マーティンエンダー14

1
@MartinBüttner確かに。piの数字だけを取得している限り、piの数字をオンラインで取得することもできます。
カルビンの趣味14

@ Calvin'sHobbies:ああすてきなので、ファイルの最初の64ki桁のpiを持つことができますか?ファイル名に+1を追加する必要がありますか?
クラウディウ14

その入力範囲は正しいですか?以下のためにN=1D=13393たとえば、あなたは、PIの第三千百万桁必要があるだろう
クラウディウ

piの最初の10億桁は、最初の著作権侵害番号の42,598桁のみを取得します
Claudiu 14

回答:


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"ます。内側のwhileループを1行にします。前後のスペースを削除しますx += 1if l not in h-> if(l in h)<1: N==0->N<1
isaacg 14

@isaacgこれらのおかげで、私はいくつかの明らかなものを投稿して見逃したとき、私は少し急いでいた。おそらく、文字列の比較を行うことができることに気付いていなかったでしょうし、これif(l in h)<1もかなり賢いです。
KSab 14

いくつかのより:初期sのパラメータとしてPdef P(N,D,s=''):)。 str(...)おそらくバッククォートで書くことができます。 while'1'>...スペースを節約します。作りhセットをとして初期化しh=l,={''}、その後、書き込みl in hとして{l}<h
flornquake 14

@flornquakeこれは非常に賢明です。特に、Pythonが辞書とは思わないように初期化する方法です。しかし、これを入れると、残念ながらh注文する必要があるかなり大きな最適化に気付きました。それでも、それは私が試して覚えておく素敵なトリックです。
KSab 14

@KSabそれはさらに良いです。:) while j+1:に短縮できますwhile-~j
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
「Haskell!」と思った 質問を見て、下にスクロールして微笑んだ。
ソハムチョードリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.