パイはあなたの番号を取得しました


30

チャレンジ:

円周率は無限であることになっています。つまり、すべての数値はpiの小数部分に含まれています。あなたの仕事は、入力で正の整数を取り、出力でこの数字の位置をpi桁で返すことです。

入力された場合、例えば59、我々は戻ります4

理由は次のとおり59です。piの桁の数字を探します

3.14159265...
     ^^

値は4桁目から始まるため、出力はになります4

他のいくつかの例:

input : 1      output : 1
input : 65     output : 7
input : 93993  output : 42
input : 3      output : 9

ルール:

  • 最初の200桁以内に存在しない数字を処理する必要はありません。
  • 標準の抜け穴は、いつものように禁止されています。
  • これはなので、少ないバイトが勝ちます。

41
あなたが言及したプロパティを持つ数字は、通常の数字として知られています。無限小数展開は、たとえ非周期的であっても、正規性を意味するものではありません。0.101001000100001 ...は反例です。
デニス

38
そして、絶対に、Piは無限であると想定されていません。ただし、10進表現は無限の数字を持ちます。
rafa11111

11
@Dennis Normalはずっと強い状態です(すべて均一vsすべて存在)
-user202729

6
0インデックスのn'thインデックスを出力できますか?したがって、テキストケースはの0, 6, 41, 8代わりに返され1, 7, 42, 9ます。
ケビンクルーッセン

7
@ rafa11111同意します。整数を破棄し、base-PIで数値を使用する必要があります。その場合、整数は代わりに無限の数字になります。
mbomb007

回答:


22

Python 2、69 75 71 67バイト

caird coinheringaahingにより4バイトを節約しました

x=p=1333
while~-p:x=p/2*x/p+2*10**200;p-=2
print`x`.find(input(),1)

3位置0 で見つからない場合、6 2バイトかかります。入力は文字列として与えられます。

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


無制限バージョン

Python 2、224バイト

def g():
 q,r,t,i,j=1,0,1,0,1
 while True:
  i+=1;j+=2;q,r,t=q*i,(2*q+r)*j,t*j;n=(q+r)/t
  if n*t>4*q+r-t:yield n;q,r=10*q,10*(r-n*t)
a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

上記で使用したものと同じ式に基づいた無制限の栓を使用します。

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


より速いバージョン

from gmpy2 import mpz
def g():
  # Ramanujan 39, multi-digit
  q, r, s ,t = mpz(0), mpz(3528), mpz(1), mpz(0)
  i = 1
  z = mpz(10)**3511
  while True:
    n = (q+r)/(s+t)
    if n == (22583*i*q+r)/(22583*i*s+t):
      for d in digits(n, i>597 and 3511 or 1): yield d
      q, r = z*(q-n*s), z*(r-n*t)
    u, v, x = mpz(1), mpz(0), mpz(1)
    for k in range(596):
      c, d, f = i*(i*(i*32-48)+22)-3, 21460*i-20337, -i*i*i*24893568
      u, v, x = u*c, (u*d+v)*f, x*f
      i += 1
    q, r, s, t = q*u, q*v+r*x, s*u, s*v+t*x

def digits(x, n):
  o = []
  for k in range(n):
    x, r = divmod(x, 10)
    o.append(r)
  return reversed(o)

a=input()
l=len(`a`)
s=z=10**l;i=1-l
p=g().next;p()
while s!=a:s=(s*10+p())%z;i+=1
print i

Ramanujan#39に基づく、はるかに高速の無制限の蛇口。

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


ニース、ハードコードも組み込みも使用しません(Pythonにはないため)
user202729


2
@Dennis 31は137で一致する必要があります:/
primo

2
これはどの近似アルゴリズムですか?ここにリストされていますか?en.wikipedia.org/wiki/Approximations_of_%CF%80
Sphinxxx

4
@Sphinxxxこれは、オイラー変換をライプニッツシリーズに適用する結果です。以前の投稿で派生を投稿しました
プリモ

19

、5バイト

€tİπd

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

説明

€tİπd                              59
    d  Convert to base-10 digits   [5,9]
  İπ     The digits of pi          [3,1,4,1,5,9..]
 t       Remove the first element  [1,4,1,5,9,2..]
€      Index of the sublist        4

1
とんでもない-しかし、私は感銘を受けたことを認めなければなりません。
フローリス

6
ゴルフの言語では、言語を知らない人は読むことができないため、通常は説明を追加することをお勧めします。私が正しく理解している場合:PI()の数字の最初の項目(先頭の3)を削除した(t)のインデックスを取得しİπ、それをbase-10(d)に変換し、STDOUTに出力します(暗黙的に)。
ケビンCruijssen

同意した、私は何を見ているのか分からない。
JAテロバ

1
@ggggのルックス、それは怠惰な表現であるように検証
ASCIIのみの

1
@ggggはİπ無制限インローで作成し、数字の無限のリストであるソース
H.PWiz

18

Excel、212バイト

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excelは小数点以下15桁しか処理しないため、piはハードコードされています。これは、この課題のかなり弱い上限です。


4
自分の投稿にコメントしてすみませんが、支持者の中にはこの回答が好きな理由を教えてもらえますか?Excelの数式と同じようにゴルフができますが、非常に長く、賢くはありません。
エンジニアトースト

6
piを任意の小数位まで計算するために組み込みのゴルフ言語に依存していないため、これが気に入っています。それは創造的ではないかもしれませんが、実用的です(ここでは実用性は重要ではありません)。
スコット

質問では入力または回答 10 進でなければならないことが指定されていないためCONCATBBP数式を使用してπ-base16の最初の200桁を計算し、代わりに16進数で検索することでこれをゴルフできますか?(365がないため、テストできません)
Chronocidal

2
Office 365の場合のみ:使用してCONCATCODEそしてMID:私は143に202文字(INCの引用)からPIの文字列を削減CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Chronocidal

1
Office365でテストすると、入力に関係なく14を出力するように見えますか?
マシューシュラッ

9

Java 8、615 217 202 184 182 166 165バイト(計算された999 200桁)

n->{var t=java.math.BigInteger.TEN.pow(200);var r=t;for(int p=667;p-->1;)r=t.valueOf(p).multiply(r).divide(t.valueOf(p-~p)).add(t).add(t);return(r+"").indexOf(n,1);}

1インデックス付き

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

Javaの組み込みにMath.PIは、他の多くの言語と同様に、15桁の10進数値の精度があります。さらに桁数を増やすには、BigIntegersまたはで自分で計算する必要がありますBigDecimals。これは、上記の..それを行うための方法である、この211バイト、笑..下に多分誰か缶ゴルフ
のポート作成:EDIT @primoをのPythonの2の回答ハードよりも短い計算するので、(彼をupvoteすることを確認してください!) -codedはそれほど遠くフェッチされていません。それを短くするためにゴルフにもう7バイト。

@Neilのおかげで-15バイト、以下のハードコードされた回答よりも短くなりました!@primoの
おかげで-36バイト。 -1バイトがに変更されるのは、1バイトより短いためです(新しいJava 10が大好きです)。
java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;var T=java.math.BigInteger.TEN.pow(200);var r=T;varnull

説明:

n->{                            // Method with String parameter and integer return-type
  var t=java.math.BigInteger.TEN.pow(200);
                                //  Temp BigInteger with value 10^200
  var r=t;                      //  Result BigInteger, also starting at 10^200
  for(int p=667;                //  Index-integer, starting at 667
      p-->1;)                   //  Loop as long as this integer is still larger than 1
                                //  (decreasing `p` by 1 before every iteration with `p--`)
    r=                          //   Replace the Result BigInteger with:
      t.valueOf(p)              //    `p`
       .multiply(r)             //    multiplied by `r`,
       .divide(t.valueOf(p-~p)) //    divided by `2*p+1`
       .add(t).add(t);          //    And add 2*10^200
  return(r+"")                  //  Convert the BigInteger to a String
    .indexOf(n,                 //  And return the index of the input,
               1);}             //  skipping the 3 before the comma

Java 8、211バイト(ハードコードされた200桁)

"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"::indexOf

0インデックス付き

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


1
!p.equals(t.ONE)たぶん?また、indexOf(n,1)-1私は思う作品。または、2バイトを保存して1インデックスにします。
ニール

最初の失敗をどのように逃したかはわかりませんが、2番目の失敗は本当に覚えておく必要があります。indexOf最初のm文字をスキップする方法があることを知りませんでした。TIL、ありがとう!
ケビンCruijssen

1
pを整数に保つのはどうですか?
プリモ

1
またp、毎回1ずつデクリメント(for(int p=667;p-->1;))してから、乗算pおよび除算することもできますp-~p
プリモ

1
の初期値はr文字通り何でも構いませんが、極端な値はより多くの反復が必要になります。最適なシード(反復回数が最も少ない)は実際には4e200です。
プリモ

6

05AB1E、6バイト

₁žs¦¹k

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

どうやって?

₁        push 256
 žs      push pi to 256 places
   ¦     remove the leading 3
    ¹    push the input
     k   index inside that string

同じ言語で同様の6バイトのソリューションを入手した場合、あなたの答えを削除しますか?
ニカエル

@nicaelは通常、問題ではありませんが、3いずれにしてもソリューションは失敗します
Uriel

ああ、確かに、thnks
ニカエル

6

MATL16 15バイト

YP8WY$4L)jXfX<q

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

説明

YP     % Push pi as a double
8W     % Push 2^8, that is, 256
Y$     % Compute pi with 256 significant digits using variable-precision arithmetic
       % The result as a string
4L)    % Remove first character. This is to avoid finding '3' in the integer part
       % of pi
j      % Push input as a string
Xf     % Strfind: gives array of indices of occurrences of the input string in the
       % pi string
X<     % Mimimum
q      % Subtract 1. Implicitly display

とても素敵で短い!仕組みを説明できますか?
ランダムな男

@Therandomguy確かに、説明を追加
ルイスメンドー

4

R +数値パッケージ、52バイト

regexec(scan(),substring(numbers::dropletPi(200),3))

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

dropletPiの最初の200桁の10進数を計算しますが、先頭にpia 3.を含むため、それを削除してsubstringからに一致しますregexec。これにより、一致に関するメタデータとともに一致のインデックスが返されます。


たぶんregexpr(scan(),numbers::dropletPi(200))-2
-djhurio

@djhurioは、小数点以下の数字を一致させる必要があるため機能しません。それも私の最初の考えでしたが、その場合はそれを台無しにします。たぶん"if"
ジュゼッペ

ここには問題はありません。入力には含まれ3.ません(入力の実数ではなく整数を扱うと仮定します)。テスト例はこれで動作します。
-djhurio

3
@djhurio正しいが、regexpr(3,numbers::dropletPi(200))-2戻る-1 べきときに戻ってくる9試してみてください
ジュゼッペ

3

ゼリー、23 バイト

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw

文字のリスト(検索する整数)を受け入れ、インデックスを返すモナドリンク。πの小数部の最初の252桁に含まれる入力に対して機能します。

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

どうやって?

これは、πライプニッツ式を使用して、先頭3(および4つの末尾の誤った数字)を含む最初の253桁を計算します。次に、先頭3が削除され、入力のインデックスが見つかります。

⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SṾḊw - Link: list of characters
⁵                       - literal ten
  ⁹                     - literal 256
 *                      - exponentiate = 10000...0 (256 zeros)
   Ḥ                    - double       = 20000...0
          ¤             - nilad followed by links as a nilad:
     ȷ                  -   literal 1000
      Ḋ                 -   dequeue -> [2,3,4,5,...,1000]
         $              -   last two links as a monad:
        J               -     range of length -> [1,2,3,4,...,999]
       +                -     addition (vectorises) -> [3,5,7,9,...,1999]
    ;                   -   concatenate -> [20000...0,3,5,7,9,...,1999]
                  \     - cumulative reduce with:
                 ɗ      -   last three links as a dyad:
               ¤        -     nilad followed by link(s) as a nilad:
            ⁹           -       chain's right argument (the right of the pair as we traverse the pairs in the list -- 3, 5, 7, 9, ...)
              2         -       literal two
             :          -       integer division (i.e. 1, 2, 3, ...)
           ×            -     multiply (the left of the pair, the "current value", by that)
                :       -   integer divide by the right argument (i.e. 3, 5, 7, 9, ...)
                   S    - sum up the values (i.e. 20000...0 + 66666...6 + 26666...6 + 11428...2 + ... + 0)
                    Ṿ   - un-evaluate (makes the integer become a list of characters)
                     Ḋ  - dequeue (drop the '3')
                      w - first (1-based) index of sublist matching the input

入力として数字のリストを使用する場合⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw(23)、整数で使用する場合⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD(24の場合)。


ライプニッツの公式に適用されるオイラーの変換を意味します。ライプニッツの式を使用して252桁を計算するには、ほとんどの人が待つのに少し時間がかかります。
プリモ

はい、それは生の形式で長い時間がかかります(それはまだ「ライプニッツ式を使用している」と信じています!)
ジョナサンアラン

3

BASH(GNU / Linux)、75 67 66バイト

Sophia Lechnerのおかげで1バイト、Cows quackのおかげで7バイト節約しました。

a=`bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1`;echo ${a%%:*}

これは、1つの引数(数値)を受け取るシェルスクリプトです。でテスト

$ bash <script-path> 59
4

このスクリプトは、最初に3つのコマンドのパイプラインを実行します。

bc -l<<<"scale=999;4*a(1)"|    #produce pi with its first 999 fractional digits
tail -c+2|                     #cut off the "3."
grep -ob $1                    #compute the byte offsets of our argument in the string

このパイプラインの結果はシェル変数に割り当てられ、aその後、最初の数値が削除されたもの以外はエコーされます。

a=`...`;         #assign the result of the pipeline to a variable
echo ${a%%:*}    #cleave off the first : character and anything following it

あいにく、bc出力行が長くなりすぎると出力行が壊れる傾向があります。見つかった番号が最初の行にない場合、これは間違った結果につながる可能性があります。環境変数を設定することでそれを回避できますBC_LINE_LENGTH

export BC_LINE_LENGTH=0

これにより、改行機能が完全に無効になります。


明らかに、他の出力が許容される場合、最後の2つのコマンドは省略できます。
これにより、48バイトのカウントが得られます

bc -l<<<"scale=999;4*a(1)"|tail -c+2|grep -ob $1

結果の出力:

$ bash <script-path> 59
4:59
61:59
143:59
179:59
213:59
355:59
413:59
415:59
731:59
782:59
799:59
806:59
901:59
923:59
940:59
987:59

いいね!あなたは間のスペースを必要としない-l<<<けれども。
ソフィア・レヒナー

プログラムに変換し、sedを使用してバイトを節約できます。オンライン
Kritixiリソス

@Cowsquackその場合、バイトカウントにシェバン行を含める必要はありませんか?
cmaster

@cmaster shebang行は、すべての言語のバイトカウントに含まれません
Kritixi Lithos

@Cowsquack提案をありがとう。ただし、追加の出力を許可する場合は、同様に省略することsedもできます(私の回答の2番目の部分を参照)。それでも、プログラムに変換すると7バイトが与えられたので、ありがとう!また、別のバイトを保存するために、tr/ headcomboをシェル変数magicに置き換えました。
cmaster

2

JavaScript、197 187

-10:ありがとう、ニール

x=>"50ood0hab15bq91k1j9wo6o2iro3by0h94bg3geu0dnnq5tcxz7lk62855h72el61sx7vzsm1thzibtd23br5tr3xu7wsekkpup10cek737o1gcr6t00p3qpccozbq0bfdtfmgk".replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1

一連の9桁のbase-36整数を受け取り、それらを10進数に変換し、それらを連結してpiの最初の200桁を作成します。


いいですね、データをエンコードしてエンコードしようとする私の試みを吹き飛ばして、あなたのアプローチは生データで38バイトを節約します。
Nit

+1-まったく同じアプローチを投稿しようとしていました。
-darrylyeo

x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+110バイトを節約するために使用します。
ニール

2

初めてコードゴルフをする。デリゲートとラムダ式を使用して、関数呼び出しを減らします。V2は、クラス名を1バイトに短縮します。

[C#]、361 355バイト

using System;class P{static void Main(){Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;Action<int>w=Console.WriteLine;w(F("1"));w(F("65"));w(F("93993"));w(F("3"));}}

フォーマット済みバージョン:

using System;

class P
{
    static void Main()
    {
        Func<string,int>F=f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;
        Action<int>w=Console.WriteLine;
        w(F("1"));
        w(F("65"));
        w(F("93993"));
        w(F("3"));
    }
}

イデオネ!

NB.Iは最初のバージョンを誤ってカウントしました。363バイトではなく、361バイトでした。

[C#]、tioバージョン218バイト

f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1

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


あなたはあなたのコードでテストケースを含める必要はありませんし、あなただけの完全なプログラムの代わりに、ラムダ(匿名)関数を使用することができます
ザックFaragher

Hyarususing System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;編集として提案しました。
ovs

私はここにいるので、テストケースを含む完全なプログラムを含める必要があると考えました。人々はデデオンにイデオンの代わりにtio.runを使用しているようです。tio.runがコードを部分に分割していることがわかります。
ハン

2

Haskell208 120バイト

a=1333
x=tail$show$foldr(\p x->p`div`2*x`div`p+2*10^200)a[3,5..a]
x!n|take(length n)x==n=0|1<2=1+tail x!n
f n=1+x!show n

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

ジョナサン・アランの提案に感謝します!

古いバージョン(208バイト)

(+1).((tail$g(1,0,1,1,3,3))!)
g(q,r,t,k,n,l)=([n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)|4*q+r-t<n*t]++[g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)])!!0
x!n|take(length n)x==n=0|1<2=1+tail x!n

実際、上記のコードがどのように機能するのかわかりません。このホワイトペーパーからそれを取りましたが、実装したのはルックアップ部分のみでした。 g(1,0,1,1,3,3)piの桁を返し、驚くほど効率的です(tio.runで10桁を4秒未満で計算します)。

入力は、検索する数値の数字で構成されるリストです。

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


私の推測では、ライプニッツの式ははるかに短くなるでしょう。
ジョナサンアラン

@JonathanAllanありがとう!試してみます。私はこのサイトが大好きです!皆さんから多くを学びました!:)
クリスティアンルパスク

@JonathanAllanを使用してpiを近似しようとしましたl=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]]が、実行に5秒かかり、7桁目はすでに間違っています。したがって、200桁を計算するのは現実的ではないかもしれません。とにかく面白い練習だったので、ありがとう!
クリスチャンルパスク

1
オイラー変換を使用する必要があります(私のゼリーの回答またはprimoのPythonの回答を参照)
ジョナサンアラン

1
リンクした論文を参照して、この記事に興味があるかもしれません。この記事では、「意図的な難読化」なしでこの記事にあるコードを再実装しています。また、結果としてかなり単純(短い)になります。g1_refセクション「より高速な無制限ジェネレーター」のメソッドを参照してください。コードはpythonです。
プリモ

2

Haskell、230バイト

遅延を使用して、最初の200桁だけでなく、πの無限桁の任意の場所にある数字を見つけます。そうそう、最初のインスタンスだけでなく、その番号のすべての(無限の数?)インスタンスを返します。

p=g(1,0,1,1,3,3)where g(q,r,t,k,n,l)=if 4*q+r-t<n*t then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l) else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
z n=[(i,take n$drop i p)|i<-[1..]]
f l=[n|(n,m)<-z$length l,m==l]

チャレンジの例

>  take 10 $ f [1]
[1,3,37,40,49,68,94,95,103,110]
>  take 10 $ f [6,5]
[7,108,212,239,378,410,514,672,870,1013]
>  take 1 $ f [9,3,9,9,3]
[42]
>  take 10 $ f [3]
[9,15,17,24,25,27,43,46,64,86]

クレジット

「p」はhttps://rosettacode.org/wiki/Pi#Haskellから取得したpi桁の無限ストリームです

> take 20 p
[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4]

...私はあなたが既にこれを知っていると思いますが、あなただけの出力にあなたのシーケンスの最初の番号を必要とする
Timtech

私は無限を受け入れると思った:D
tombop

2

SmileBASIC、179 164バイト

INPUT I$FOR I=0TO 103Q$=Q$+STR$(ASC("\A#YO &.+& O2TGE']KiRa1,;N(>VYb>P0*uCb0V3 RB/]T._2:H5;(Q0oJ2)&4n7;@.^Y6]&"[I]))NEXT?INSTR(Q$,I$)+1

piの数字はハードコーディングされ、文字のASCII値にパックされます。14-> CHR$(14)、15-> CHR$(15)、92-> \、65-> A、35-> #

文字列には印刷できない文字が含まれているため、16進数で書き込まれたバイトは次のとおりです。 0E 0F 5C 41 23 59 4F 20 26 2E 1A 2B 26 20 4F 32 1C 54 13 47 45 27 5D 4B 69 52 00 61 31 2C 3B 17 00 4E 10 28 3E 56 14 59 62 3E 50 03 30 19 03 2A 75 00 43 62 15 30 00 56 33 20 52 1E 42 2F 00 5D 54 2E 00 5F 32 3A 16 1F 48 35 3B 28 51 1C 30 6F 4A 32 1C 29 00 1B 00 13 26 34 6E 37 3B 40 2E 16 5E 59 36 5D 00 26 13 06

10進数では、piの数字を確認できます。 14 15 92 65 35 89 79 32 38 46 26 43 38 32 79 50 28 84 19 71 69 39 93 75 105 82 0 97 49 44 59 23 0 78 16 40 62 86 20 89 98 62 80 3 48 25 3 42 117 0 67 98 21 48 0 86 51 32 82 30 66 47 0 93 84 46 0 95 50 58 22 31 72 53 59 40 81 28 48 111 74 50 28 41 0 27 0 19 38 52 110 55 59 64 46 22 94 89 54 93 0 38 19 6


完全なコードを投稿すると、回答を確認しやすくなります。
プリモ

1
削除/表示されない無効な文字があるため、投稿できません。私はアスキーコードを投稿できると思います。
12Me21

たとえば、xxdを使用して、hexdumpを投稿できます。
ナサニエル

2

ルビー37 35バイト

p"#{BigMath::PI 200}"[3..-3]=~/#$_/

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

特別なことはなく、組み込みライブラリを紹介するだけです。出力は0から始まります。Pi文字列はとしてフォーマットされている0.31415...e1ため、最初の3文字を削除する必要があります。e1最後の部分は実際には何の害もありませんが、とにかく範囲の終わり(またはスライスの長さ)の値を提供する必要があるので、それも取り除かれます。


短くて読みやすい!
pjs

2

27 15バイト

I⊖∨⌕I▷N⟦≕Piφ⟧θχ

オンラインでお試しください!リンクは、コードの詳細バージョンです。最大1000桁まで機能します。説明:

        ≕Pi     Get variable `Pi`
           φ    Predefined variable 1000
     ▷N⟦    ⟧   Evaluate variable to specified precision
    I           Cast to string
             θ  First input
   ⌕            Find
              χ Predefined variable 10
   ∨             Logical OR
  ⊖              Decrement
 I               Cast to string
                 Implicitly print

固定、13バイト。サイドノート:これは本当にチートな感じ:P
ASCIIのみ

実際には固定、13バイト。暗黙的な入力を使用します。(意図した動作ではありませんが、他のどの方法よりも便利なようです)。また、フィルバグの例にリンクできますか?
ASCIIのみ

@ ASCII-only Fill weirdness-カーソルがそこにあるのはなぜですか?
ニール

:| ああ、私はできるだけ早くそれを修正する必要があります見当がつかない
ASCIIのみ

nvm私はばか、コミットされた修正です。
ASCIIのみ

2

Japt186 177バイト

`nqnrvosrpruvtvpopuqsosqppÕÝvr¶uuqnvtnsvpvvptrnmruomvtqvqqrvopmÉæqÛàÑ$vvÔàmpqupqm¡vuqum«rnpopmssqtmvpuqqsmvrrmruoopÌÊprvqÛ$uqunnqr¶uqn¶tmnvpÔnmrrrvsqqsoovquvrqvpmpunvs`®c -#mÃbU

JaptはJavascriptの15桁のPi制約とshocoを共有するため、Japtで使用されるエンコードは数値をエンコードしないため、圧縮にはいくつかのシェナンガンが必要です。

簡単に説明すると、先頭はエンコードされた形式の次の文字列です。

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

これは、各文字の文字列です'm' + corresponding digit of pi。私はアルファベット全体をテストし、その文字は数バイトで最高の圧縮を提供します。

バックティックは、Japtに文字列をデコードするよう指示します。残りは非常に簡単です:

®c -#mÃbU
®          // Given the above string, map each letter
 c         // and return its charcode
   -#m     // minus the charcode of 'm', 109.
      Ã    // When that's done,
        bU // find the index of the implicit input U.

一致するフラグメントの0から始まるインデックスを出力します。Oliverの
おかげで、さらに2バイト削りました。

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


1
賢いアイデア!あなたは置き換えることができ£X®} してÃ
オリバー

@Oliverそれらに感謝します、私はまだJaptを学んでいるので、すべての助けが非常に感謝されます。
NIT

1
あなたはこれまで素晴らしいことをしてきました!109よりも良いオフセットがあるかどうか興味がありました。ブルートフォーサーを作成しましたが、109が最適であることがわかりました。うまくやった:)
オリバー

@Oliverそれをありがとう、私は単純にazの範囲全体を試してみました。:P
Nit

1

AWK -M、131の119 117バイト

-M任意精度の計算にフラグを使用します。p=k=0複数行入力を可能にするために、TIOリンクに(5バイト)を追加

{CONVFMT="%.999f";PREC=1e3;for(p=k=0;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++;$0=$1==3?9:index(p,$1)-2}1

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

説明:

{CONVFMT="%.999f";  # Allows 999 decimal digits to be used when numbers are convert to strings
PREC=1e3;           # Digits of precision to use for calculations
for(;k<1e3;)p+=(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))/16^k++; # The most concise numerical calculation I could find. It doesn't converge  extremely rapidly, but it seems to work OK
$0=$1==3?9:index(p,$1)-2}  # Replace input line with either 9 or index-2
                           # since indices will either be 1 (meaning 3 was input) or >= 3
1                   # Print the "new" input line

私の最初の試みsprintfは小数を取得するために使用されました。使用CONVFMTは間違いなくクリーンです。
ロバートベンソン

2
フラグを使用する必要はありません:メタコンセンサスがこのAWKは異なる言語を検討することではない、「とAWK -M旗」
ジュゼッペ

知っておくといい。メタにもっと時間をかけるべきだと思う...自由な時間を使って。:)
ロバートベンソン

1

ゼリー、24バイト

ȷ*
ȷR×¢:Ḥ‘$ƲU×:¢+¢ʋ/ḤṾḊw

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

使用マチンの公式、具体的には1/4日焼けPI == -1(1/2)+日焼け-1(1/3)。

式pi / 2 == 1 + 1/3×(1 + 2/5×(1 + 3/7×(1 + 4/9×(...))))を使用します


ØPMで数字を取得する方法はありますか?
ディルナン

@dylnan やや、しかしMはゼリーではありません。
user202729

私はそれらが異なっていることを知っています。私が考えなかったと信じられないfloor。Mで回答として投稿するためにそれを使用する場合、注意してください。
ディルナン


1

Pythonの2 239 238 229 214バイト

@primoによる-9バイト

from bigfloat import*;a=s=n=10**10**5;b=k=0
while a:k+=1;a*=k*(k*(108-72*k)-46)+5;a/=k**3*(640320**3/24);s+=a;b+=k*a
with precision(10**7):print`(426880*sqrt(10005*n)*n)/(13591409*s+545140134*b)`.find(input())-16

Chudnovsky-Ramanujanアルゴリズムを使用して、π の最初の100万桁 50000桁を見つけ(さらに変更10**10**510**10**6ますが、実行に時間がかかります)、目的の文字列を検索します。


結果を確認しようとしましたが、終了しないようです(n=10**10**5約10秒かかります)。
プリモ

@primo私はそれが速いと言ったことはありません!10**10**6私のマシンでは約7分かかります。公平を期す10**10**5ために、最初の50000桁を与えるので、それほど悪くもないと思います:)
DividedByZero

@primo任意精度ライブラリをbigfloatに変更しましたが、今でははるかに高速に実行されます。
DividedByZero

今ではずっと高速です。に切り替えることをお勧めしますgmpy2bigfloat、数十バイト節約できます。反復の開始に移動すると、の割り当てをkマージできます。としてより簡潔に書くことができます。Python 2を宣言する場合、整数の除算はで置き換えることができ、括弧も必要ありません。スペースはでも削除できます。50000桁までしか検証しません。k=b=0k+=1-(6*k-5)*(2*k-1)*(6*k-1)k*(k*(108-72*k)-46)+5///printimport*
プリモ

n中にはsqrt(10005*n)、問題のようです。小数点を50000位に移動しています。興味のある方のために、ここに私自身のChudnovsky実装があります:オンラインで試してみてください!
primo

1

Visual Basic-114バイト

さて、最初の提出。私に簡単に行きます!

    Dim s,p As String
    s=Console.Readline()
    p=Math.PI
    Console.Write((p.IndexOf(s,2)-1))

フィードバック歓迎!

質問が「する必要はない」ではなく「する必要はない」と言うので、PIの最初の256部分に制限していません。


仮想基本についてはあまり知りませんが、すべてのスペースを削除することでバイトを節約できると思います。また、コードを関数に保存し、「console.log」ではなく値を返すことができるはずです(そのようなバイトがいくつか得られると思います)。ああ、そしてあなたは値を入力しなければならず、それをハードコードしません。
ランダムな男

ありがとう。入力を優先して、スペースを削除し、ハードコードされた値を削除しました。カウントを114に増やします!値を返すための関数はバイトカウントに含まれませんか?そうだとしたらもっと長くなると思います。
user9338709

サイトへようこそ!これは機能しているように見えます(オンラインで試してみてください!)が、スニペットであるように思われ、提出は完全なプログラムまたは機能である必要があります。
ドムヘイスティングス

このようなことはうまくいくかもしれませんが、おそらくもっと良い方法があります!多くの提出物が使用するテンプレートについては、そのページの上部にあるリンクメニューをご覧ください!
ドムヘイスティングス

実際、定数は200桁ではないようです :( オンラインで試してみてください! -これは197を返すはずです。
Dom Hastings

0

Javascript 217バイト(ハードコードされた200)

a=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".search(a)+1

0

PHP、27バイト

それほどセリウスの答えではありません。pi()のデフォルトは200ではなく14桁であるため、php.iniの設定を変更する必要がありますが、一度PHPソリューションがかなりエレガントになります。

<?=strpos(pi(),$_GET[n])-1;

これが実際に機能するとは思わない。precisionphp.ini のタグは表示の精度を変更するだけで、定義された定数の精度は実際には向上しません。目撃者
プリモ




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