piのn番目の小数を見つける


33

既にpi専用の30の課題がありますが、n番目の小数を見つけるように1つだけ要求されるわけではありません。

チャレンジ

0 <= n <= 10000表示範囲内の任意の整数の場合、πのn番目の小数。

ルール

  • 小数点以下はすべての数字です 3.
  • あなたのプログラムは機能、または完全なプログラムかもしれません
  • 結果を基数10で出力する必要があります
  • n任意の適切な入力メソッド(stdin、input()、関数パラメーターなど)から取得できますが、ハードコードされていません
  • 選択した言語のネイティブの場合は、1ベースのインデックスを使用できます
  • 無効な入力(n == -1n == 'a'またはn == 1.5)に対処する必要はありません。
  • 少なくとも 10kの小数までサポートする場合、組み込みが許可されます
  • これは最短のコードであり、最速のコードではないため、ランタイムは関係ありません
  • これは、バイト単位の最短コードが勝ちです

テストケース

f(0)     == 1
f(1)     == 4 // for 1-indexed languages f(1) == 1
f(2)     == 1 // for 1-indexed languages f(2) == 4
f(3)     == 5
f(10)    == 8
f(100)   == 8
f(599)   == 2
f(760)   == 4
f(1000)  == 3
f(10000) == 5

参考のため、ここでは PIの最初の100kの桁があります。


ビルトイン?例str(pi())[n+2]
プリモ

6
IMOの最も近い重複ターゲットは、piの切り捨てられた数字の累乗の計算(パラメーターをオーバーロードするか、このチャレンジに適用される有限の差になります)、piを正確送信(インデックスを追加し、印刷を抑制)、およびPiウィンドウ暗号化です。
ピーターテイラー

3
@Suever ofcourse!そのルールは、ちょうど10Kはあなたのプログラムが処理することができるはずという最小であることを指摘することである
Bassdrop Cumberwubwubwub

4
テストケースにf(599)を追加することをお勧めします。これは簡単に間違える可能性があるためです(10進数で約3桁の精度が必要です)。
aditsu

2
また、シーケンス4 999999 8 で始まるf(760)= 4は、誤って丸めやすくなります。
アンデルスカセオルグ16

回答:


22

05AB1E、3バイト

žs¤

説明した

žs   # push pi to N digits
  ¤  # get last digit

オンラインで試す

1ベースのインデックスを使用します。
最大10万桁をサポートします。


Piからn桁は丸められませんか?
busukxuan

7
@busukxuanいいえ。事前に定義されたpiから100k桁の定数を使用し、N個を取得します。
エミグナ

4
@Emignaそれはとても便利です。良い解決策。
-Suever

2
短くシャープ、最高のPCG
Xylius

16

Python 2、66バイト

n=input()+9
x=p=5L**7
while~-p:x=p/2*x/p+10**n;p-=2
print`x/5`[-9]

入力は標準入力から取得されます。


サンプルの使用法

$ echo 10 | python pi-nth.py
8

$ echo 100 | python pi-nth.py
8

$ echo 1000 | python pi-nth.py
3

$ echo 10000 | python pi-nth.py
5

アルゴリズムでnを使用する場合は注意してください。599の出力は1ではなく2である必要があります。また、Python 2を使用していることを指定することもできます
。– aditsu

@aditsuが更新されました。すべてのために確認済みのn≤1000年
プリモ

1
あなたが取る場合はn、入力プラス9であることを、あなたは括弧を避けることができます。
xnor

@xnor d'oh。ありがとう;)
プリモ

2
このアルゴリズムによって生成される最初の数桁は「3.141596535897932…」であり、5と6の間に「2」がありません。なぜですか?それは、Python 2の ``演算子がL文字列にan を追加し始めるときだからです。
アンデルスカセオルグ16

11

Bash + coreutils、60 49バイト

echo "scale=10100;4*a(1)"|bc -l|tr -d '\\\n'|cut -c$(($1+2))

bc -l<<<"scale=$1+9;4*a(1)-3"|tr -dc 0-9|cut -c$1

デニスによって改善されました。ありがとう!

インデックスは1ベースです。


11

Python 2、73 71 73バイト

スコアを2バイト増やしてくれた@aditsuに感謝

最後に、2秒未満で完了するアルゴリズム。

n=10**10010
a=p=2*n
i=1
while a:a=a*i/(2*i+1);p+=a;i+=1
lambda n:`p`[n+1]

できた!

テイラーシリーズを使用してpi = 4*arctan(1)計算arctan(1)するときに数式を使用します。


かなりスピーディー。ただし、1インデックスはPythonにネイティブではありません。最後に(確かに私はしばらくの間活動していない)、コンセンサスは、機能を定義する必要があることf=lambda n:...でした。
プリモ

2
ここのほぼすべてのラムダは匿名です(このサイトのPythonで回答を検索できます)
Leaky Nun

関連するメタ投稿。(あなたのコードを実行した後に、関数参照をキャプチャする方法はありませんルール1と3に違反しているように見える。関数定義は、各入力のために入力する必要があるだろう((lambda n:`p`[n+1])(1)(lambda n:`p`[n+1])(2)。、...)
プリモ

1
コードを直接実行することはできません。import事前にステートメントを配置することに似ていますが、これは事前にいくつかのグローバル変数を作成するだけです。
リーキー修道女

i=3 while a:a=i/2*a/i;p+=a;i+=24.ため
プリモ

7

MATL、11 10バイト

@Luisのおかげで1バイト節約

YPiEY$GH+)

このソリューションは、1ベースのインデックス作成を利用します

オンラインで試す

すべてのテストケース

説明

YP  % Pre-defined literal for pi
iE  % Grab the input and multiply by 2 (to ensure we have enough digits to work with)
Y$  % Compute the first (iE) digits of pi and return as a string
G   % Grab the input again
H+  % Add 2 (to account for '3.') in the string
)   % And get the digit at that location
    % Implicitly display the result

@LuisMendo Oh yea出力はすでに文字列です。ど!
-Suever

@LuisMendoああ、私は実際にそれを考えたことがありません。私は常にYPシンボリックツールボックスのテストで使用します
-Suever

YPは実際に許可されていますか?質問では、
10000

@Suever OPは、「少なくとも」ではなく「〜まで」と述べました。私の理解では、> 10kをサポートすることは禁止されています。
-busukxuan

@Sueverうん、私はそうするかもしれないと思う。そのため、セージの回答を削除しました。
-busukxuan

6

Mathematica 30バイト

RealDigits[Pi,10,1,-#][[1,1]]&

f=%

f@0
f@1
f@2
f@3
f@10
f@100
f@599
f@760
f@1000
f@10000

1
4
1
5
8
8
2
4
3
5


5

セージ、32 25バイト

lambda d:`n(pi,9^5)`[d+2]

この種の言語での私の最初の答え。

nラウンドpi17775桁。


1
print呼び出しが必要です。それ以外の場合、これはREPLでのみ機能するスニペットです。
メゴ

これは、(理論上は)任意の入力のために動作します:lambda d:`n(pi,digits=d+5)`[-4]
MEGO

2
@Megoには「99999」の実行はありませんか?
busukxuan

1
@Megoが、その後、さらに「9」回実行されます。長さを2倍にすることで普遍化できるかどうかは
わかり

1
@busukxuan計算されていないπの数字をランダムにモデル化すると、9の任意の長い実行が確実に予想されます(実際のπが異なることを期待する理由はありませんが、これを証明していません)位置が限りなく小さい確率で9のランを実行します(ただし、実際のπが予期しない動作をしないことは証明されていません)。少なくとも9つの9の実行が見つかりましたが、これは[-8]提案を破るのに十分だと思います。
アンデルスカセオルグ16


4

Mathematica、23 21バイト

⌊10^# Pi⌋~Mod~10&

SageMath、24バイト

lambda n:int(10^n*pi)%10

@LLlAMnYP私はそれを試してみましたが、Mathematicaは間にスペースが必要ですようだPi(または間#および乗算が反転している場合)、その保存されなくなります。
アンデルスカセオルグ16

実際、それはMathematica Online(コンソールバージョンを使用していた)で機能するため、それを使用すると思います。
アンデルスカセオルグ16

4
これらは別々の答えでなければなりません。彼らは同じ戦略を使用していますが、同じ言語に近いところはありません。
メゴ

@Mego 私が見つけたポリシーでは、異なる言語での回答は非常に類似しているとは見なされません。(それを示唆する答えは受け入れられませんでした。)別のポリシーを参照していますか、それとも単に好みですか?
アンデルスカセオルグ16

3

J19 15バイト

10([|<.@o.@^)>:

整数nを取り、piのn 番目の桁を出力します。ゼロベースのインデックスを使用します。n 番目の桁を取得するには、piに10 n +1を掛けて、その値の下限を取得し、10を法として取得します。

使用法

入力は拡張整数です。

   f =: 10([|<.@o.@^)>:
   (,.f"0) x: 0 1 2 3 10 100 599 760 1000
   0 1
   1 4
   2 1
   3 5
  10 8
 100 8
 599 2
 760 4
1000 3
   timex 'r =: f 10000x'
1100.73
   r
5

私のマシンでは、10000 番目の桁を計算するのに約18分かかります。

説明

10([|<.@o.@^)>:  Input: n
             >:  Increment n
10               The constant n
           ^     Compute 10^(n+1)
        o.@      Multiply by pi
     <.@         Floor it
   [             Get 10
    |            Take the floor modulo 10 and return

3

Clojure、312バイト

(fn[n](let[b bigdec d #(.divide(b %)%2(+ n 4)BigDecimal/ROUND_HALF_UP)m #(.multiply(b %)%2)a #(.add(b %)%2)s #(.subtract % %2)](-(int(nth(str(reduce(fn[z k](a z(m(d 1(.pow(b 16)k))(s(s(s(d 4(a 1(m 8 k)))(d 2(a 4(m 8 k))))(d 1(a 5(m 8 k))))(d 1(a 6(m 8 k)))))))(bigdec 0)(map bigdec(range(inc n)))))(+ n 2)))48)))48)))

だから、おそらくあなたが言うことができるように、私は何をしているのか分かりません。これは何よりもコミカルになりました。「pi to n digit」とGoogleで検索し、ウィキペディアのページでBailey–Borwein–Plouffeの公式を見つけました。数式を読むのにかろうじて十分なCalculus(?)を知っていたので、Clojureに変換することができました。

翻訳自体はそれほど難しくありませんでした。数式には次が必要なので、最大n桁の精度を処理することが困難でした(Math/pow 16 precision)。本当に速く巨大になります。これが機能するためにはBigDecimalどこでも使用する必要があり、それは本当に物事を肥大化しました。

ゴルフをしていない:

(defn nth-pi-digit [n]
  ; Create some aliases to make it more compact
  (let [b bigdec
        d #(.divide (b %) %2 (+ n 4) BigDecimal/ROUND_HALF_UP)
        m #(.multiply (b %) %2)
        a #(.add (b %) %2)
        s #(.subtract % %2)]
    (- ; Convert the character representation to a number...
      (int ; by casting it using `int` and subtracting 48
         (nth ; Grab the nth character, which is the answer
           (str ; Convert the BigDecimal to a string
             (reduce ; Sum using a reduction
               (fn [sum k]
                 (a sum ; The rest is just the formula
                       (m
                         (d 1 (.pow (b 16) k))
                         (s
                           (s
                             (s
                               (d 4 (a 1 (m 8 k)))
                               (d 2 (a 4 (m 8 k))))
                             (d 1 (a 5 (m 8 k))))
                           (d 1 (a 6 (m 8 k)))))))
               (bigdec 0)
               (map bigdec (range (inc n))))) ; Create an list of BigDecimals to act as k
           (+ n 2)))
      48)))

言うまでもなく、数学を知っているなら、これについてもっと簡単な方法があると確信しています。

(for [t [0 1 2 3 10 100 599 760 1000 10000]]
  [t (nth-pi-digit t)])

([0 1] [1 4] [2 1] [3 5] [10 8] [100 8] [599 2] [760 4] [1000 3] [10000 5])

後で、標準演算子が実際に大きな小数で動作するため、上部のショートカットは不要であることに気付きました。ある時点でこれを修正します。それはおそらく50バイトまでをノックオフします。
発がん性物質

2

Clojure、253バイト

(defmacro q[& a] `(with-precision ~@a))(defn h[n](nth(str(reduce +(map #(let[p(+(* n 2)1)a(q p(/ 1M(.pow 16M %)))b(q p(/ 4M(+(* 8 %)1)))c(q p(/ 2M(+(* 8 %)4)))d(q p(/ 1M(+(* 8 %)5)))e(q p(/ 1M(+(* 8 %)6)))](* a(-(-(- b c)d)e)))(range(+ n 9)))))(+ n 2)))

この式を使用して数値piを計算します。with-precision頻繁に使用されるため、マクロを再定義する必要があります。

あなたはここに出力を見ることができます:https://ideone.com/AzumC3 1000と10000は超えideoneに使用制限時間を要し、肩をすくめ


2

Python 3、338バイト

この実装は、piを推定する最速のアルゴリズムの1つであるChudnovskyアルゴリズムに基づいています。反復ごとに、およそ14桁が推定されます(詳細については、こちらをご覧ください)。

f=lambda n,k=6,m=1,l=13591409,x=1,i=0:not i and(exec('global d;import decimal as d;d.getcontext().prec=%d'%(n+7))or str(426880*d.Decimal(10005).sqrt()/f(n//14+1,k,m,l,x,1))[n+2])or i<n and d.Decimal(((k**3-16*k)*m//i**3)*(l+545140134))/(x*-262537412640768000)+f(n,k+12,(k**3-16*k)*m

オンラインでお試しください!


1

Java 7、262 260バイト

import java.math.*;int c(int n){BigInteger p,a=p=BigInteger.TEN.pow(10010).multiply(new BigInteger("2"));for(int i=1;a.compareTo(BigInteger.ZERO)>0;p=p.add(a))a=a.multiply(new BigInteger(i+"")).divide(new BigInteger((2*i+++1)+""));return(p+"").charAt(n+1)-48;}

使用LeakyNunさん@ Pythonの2のアルゴリズム

未ゴルフ&テストコード:

ここで試してみてください。

import java.math.*;
class M{
  static int c(int n){
    BigInteger p, a = p = BigInteger.TEN.pow(10010).multiply(new BigInteger("2"));
    for(int i = 1; a.compareTo(BigInteger.ZERO) > 0; p = p.add(a)){
      a = a.multiply(new BigInteger(i+"")).divide(new BigInteger((2 * i++ + 1)+""));
    }
    return (p+"").charAt(n+1) - 48;
  }

  public static void main(String[] a){
    System.out.print(c(0)+", ");
    System.out.print(c(1)+", ");
    System.out.print(c(2)+", ");
    System.out.print(c(3)+", ");
    System.out.print(c(10)+", ");
    System.out.print(c(100)+", ");
    System.out.print(c(599)+", ");
    System.out.print(c(760)+", ");
    System.out.print(c(1000)+", ");
    System.out.print(c(10000));
  }
}

出力:

1, 4, 1, 5, 8, 8, 2, 4, 3, 5

1

Smalltalk – 270バイト

アイデンティティtan⁻¹(x) = x − x³/3 + x⁵/5 − x⁷/7 ...に依存していπ = 16⋅tan⁻¹(1/5) − 4⋅tan⁻¹(1/239)ます。SmallTalkは無制限の精度の整数演算を使用するため、待機しても構わない場合は大きな入力で機能します。

|l a b c d e f g h p t|l:=stdin nextLine asInteger+1. a:=1/5. b:=1/239. c:=a. d:=b. e:=a. f:=b. g:=3. h:=-1. l timesRepeat:[c:=c*a*a. d:=d*b*b. e:=h*c/g+e. f:=h*d/g+f. g:=g+2. h:=0-h]. p:=4*e-f*4. l timesRepeat:[t:=p floor. p:=(p-t)*10]. Transcript show:t printString;cr

pi.st次のテストケースのように保存して実行します。インデックス作成は1つに基づいています。

$ gst -q pi.st <<< 1
1
$ gst -q pi.st <<< 2
4
$ gst -q pi.st <<< 3
1
$ gst -q pi.st <<< 4
5
$ gst -q pi.st <<< 11
8
$ gst -q pi.st <<< 101
8
$ gst -q pi.st <<< 600
2
$ gst -q pi.st <<< 761
4
$ gst -q pi.st <<< 1001
3
$ gst -q pi.st <<< 10001 -- wait a long time!
5

1

JavaScript(Node.js)(Chrome 67 +)、75 73 67 63バイト

n=>`${eval(`for(a=c=100n**++n*20n,d=1n;a*=d;)c+=a/=d+++d`)}`[n]

オンラインでお試しください!

を使用して π/2=k=0k/2k+1(Leaky NunのPythonの回答で使用されているのと同じロジックですが、これを短くするJSの構文のおかげです)。入力はBigIntとして関数に渡されます。1ベースのインデックスが使用されている場合、2バイトを削除できます。

n=>`${eval(`for(a=c=100n**n*20n,d=1n;a*=d;)c+=a/=d+++d`)}`[n]

JavaScript(Node.js)(Chrome 67 +)、90 89バイト

n=>`${eval(`for(a=100n**++n*2n,b=a-a/3n,c=0n,d=1n;w=a+b;a/=-4n,b/=-9n,d+=2n)c+=w/d`)}`[n]

オンラインでお試しください!

を使用して π/4=アークタン1/2+アークタン1/3。入力はBigIntとして関数に渡されます。1ベースのインデックスが使用されている場合、2バイトを削除できます。

n=>`${eval(`for(a=100n**n*2n,b=a-a/3n,c=0n,d=1n;w=a+b;a/=-4n,b/=-9n,d+=2n)c+=w/d`)}`[n]

0

メープル、24バイト

 trunc(10^(n+1)*Pi)mod 10

テストケース:

> f:=n->trunc(10^(n+1)*Pi)mod 10;
> f(0);
  1
> f(1);
  4
> f(2);
  1
> f(3);
  5
> f(10);
  8
> f(100);
  8
> f(599);
  2
> f(760);
  4
> f(1000);
  3
> f(10000);
  5

0

C#、252 250バイト

d=>{int l=(d+=2)*10/3+2,j=0,i=0;long[]x=new long[l],r=new long[l];for(;j<l;)x[j++]=20;long c,n,e,p=0;for(;i<d;++i){for(j=0,c=0;j<l;c=x[j++]/e*n){n=l-j-1;e=n*2+1;r[j]=(x[j]+=c)%e;}p=x[--l]/10;r[l]=x[l++]%10;for(j=0;j<l;)x[j]=r[j++]*10;}return p%10+1;}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.