Pi mendapat nomor Anda

30

Tantangan:

Pi seharusnya tidak terbatas. Itu berarti setiap angka terdapat di dalam bagian desimal pi. Tugas Anda adalah mengambil bilangan bulat positif pada input dan mengembalikan posisi angka ini dalam digit pi pada output.

Misalnya, jika inputnya adalah 59, kami akan kembali4

Inilah sebabnya: kita akan mencari angka 59dalam digit pi

3.14159265...
     ^^

Nilainya dimulai pada digit ke-4, sehingga hasilnya akan menjadi 4.

Beberapa contoh lain:

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

Aturan:

  • Anda tidak harus menangani angka yang tidak ada dalam 200 digit pertama
  • Celah standar, seperti biasa, dilarang.
  • Ini , jadi semakin sedikit byte yang menang.
Pria acak
sumber
41
Angka dengan properti yang Anda sebutkan dikenal sebagai angka normal . Ekspansi desimal tak terbatas, bahkan jika non-periodik, tidak menyiratkan normalitas. 0.101001000100001 ... adalah contoh tandingan.
Dennis
38
Dan, tentu saja, Pi tidak seharusnya tak terbatas. Representasi desimal, bagaimanapun, memiliki angka yang tak terbatas.
rafa11111
11
@Dennis Normal adalah kondisi yang jauh lebih kuat (semua seragam vs semua yang ada)
user202729
6
Apakah kita diizinkan untuk mengeluarkan indeks nke -0 yang diindeks ? Jadi kotak teks akan kembali 0, 6, 41, 8sebagai gantinya 1, 7, 42, 9.
Kevin Cruijssen
7
@ rafa11111 Saya setuju. Kita harus meninggalkan bilangan bulat dan menggunakan angka dalam basis-PI. Maka bilangan bulat akan memiliki angka tak terbatas, sebagai gantinya.
mbomb007

Jawaban:

22

Python 2, 69 75 71 67 byte

Disimpan 4 byte karena caird coinheringaahing .

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

Tidak menemukan 3di posisi nol biaya 6 2 byte. Input diberikan sebagai string.

Cobalah online!


Versi Tidak Terbatas

Python 2, 224 byte

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

Menggunakan keran yang tidak terikat berdasarkan rumus yang sama yang digunakan di atas.

Cobalah online!


Versi lebih cepat

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

Keran tak terikat yang jauh lebih cepat, berdasarkan Ramanujan # 39 .

Cobalah online!

primo
sumber
Bagus, tidak ada hardcodes atau menggunakan built-in (karena Python tidak punya)
user202729
1
Reduksi 4 byte sepele
caird coinheringaahing
2
@Dennis 31 harus cocok di 137: /
primo
2
Algoritma aproksimasi manakah ini? Apakah ini tercantum di sini? en.wikipedia.org/wiki/Approximations_of_%CF%80
Sphinxxx
4
@Sphinxxx itu adalah penerapan kembali transformasi Euler ke seri Leibniz. Saya telah memposting derivasi pada posting sebelumnya .
primo
19

Sekam , 5 byte

€tİπd

Cobalah online!

Penjelasan

€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
Fyr
sumber
1
Konyol - tetapi saya harus mengakui bahwa saya terkesan.
Floris
6
Dengan bahasa golf biasanya merupakan ide bagus untuk menambahkan penjelasan, karena seseorang yang tidak tahu bahasa tidak akan bisa membacanya. Jika saya mengerti benar itu: Ambil indeks ( ) dengan item pertama (yang terdepan 3) dihapus ( t) dari digit PI ( İπ), ubah menjadi basis-10 ( d) dan hasilkan menjadi STDOUT (secara implisit).
Kevin Cruijssen
Setuju, saya tidak tahu apa yang saya lihat.
JA Terroba
1
@gggg sepertinya itu adalah contoh representasi malas , verifikasi
ASCII-only
1
@gggg İπadalah daftar digit tanpa batas, dibuat dengan sumber
batas
18

Excel, 212 byte

=FIND(A1,"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196")

Excel hanya menangani 15 tempat desimal sehingga pi hanya kode-keras. Ini harus menjadi batas atas yang cukup lemah untuk tantangan ini.

Toast insinyur
sumber
4
Saya minta maaf untuk mengomentari posting saya sendiri, tetapi dapatkah sebagian dari para upvoter memberi tahu saya mengapa mereka menyukai jawaban ini? Ini sama golfnya dengan formula Excel tetapi sangat panjang dan sama sekali tidak pintar.
Engineer Toast
6
Saya suka ini karena tidak bergantung pada bahasa golf yang memiliki builtin untuk menghitung pi ke tempat desimal yang sewenang-wenang. Mungkin tidak kreatif, tetapi praktis (bukan karena kepraktisan penting di sini).
Scott
Karena pertanyaan tidak menentukan bahwa input atau jawaban harus berupa basis 10, dapatkah Anda menggunakan ini dengan menggunakan CONCATdan formula BBP untuk menghitung 200 digit pertama π-base16 dan mencari dalam Hexadecimal sebagai gantinya? (Tidak punya 365, jadi tidak bisa menguji)
Chronocidal
2
Hanya Office 365: menggunakan CONCAT, CODEdan MIDsaya mengurangi string PI dari 202 karakter (termasuk kutipan) menjadi 143:CONCAT(CODE(MID(".ÜÁ£ÙÏ ¦®š«¦ Ï²œÔ“ÇŧÝËŠº”ᱬ»—‡ÑÀ†œ¾ˆãÖœƒ°™¢•‘†ÏÒŽÐÖ³ ÒžÂ¯‰¦¬¼ß²º–ŸÈµ»¨Ñœ°‹‘­‚ÔŠ›ÝÕ•Š·»À®–Þٶ݃Ñà",2*ROW(A1:A100)-1,2))-32)
Chronocidal
1
Pengujian dengan Office365, sepertinya keluaran 14 terlepas dari input?
Matthew Schlachter
9

Java 8, 615 217 202 184 182 166 165 byte (dihitung 999 200 digit)

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-diindeks

Cobalah online.

Java builtin Math.PImemiliki ketepatan 15 nilai desimal, seperti banyak bahasa lainnya. Untuk memiliki lebih banyak digit, Anda harus menghitungnya sendiri dengan BigIntegersatau BigDecimals. Ini di atas adalah cara untuk melakukannya .. Mungkin seseorang dapat golf ini di bawah 211 byte, lol ..
EDIT: Membuat port jawaban @primo dari Python 2 (pastikan untuk membesarkan hati dia!), Jadi menghitung lebih pendek daripada sulit -coded tidak terlalu dibuat-buat lagi. Hanya 7 byte lebih ke golf agar lebih pendek.

-15 byte terima kasih kepada @Neil , membuatnya lebih pendek dari jawaban yang dikodekan di bawah ini!
-36 bytes terima kasih kepada @primo .
-1 byte berubah java.math.BigInteger t=null,T=t.TEN.pow(200),r=T;menjadi var T=java.math.BigInteger.TEN.pow(200);var r=T;, karena var1 byte lebih pendek dari null(harus menyukai Java 10 baru).

Penjelasan:

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 byte (hard-kode 200 digit)

"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196"::indexOf

Diindeks 0

Cobalah online.

Kevin Cruijssen
sumber
1
!p.equals(t.ONE)mungkin? Juga, indexOf(n,1)-1karya saya pikir. Atau simpan 2 byte dan buat 1-diindeks.
Neil
Tidak yakin bagaimana saya melewatkan yang pertama, tetapi yang kedua saya benar-benar perlu diingat. Tidak tahu ada indexOfmetode yang melompati mkarakter pertama . TIL, terima kasih!
Kevin Cruijssen
1
Bagaimana kalau menyimpan bilangan bulat ?
Primo
1
Anda juga dapat mengurangi psatu setiap kali ( for(int p=667;p-->1;)), lalu mengalikan dengan pdan membaginya dengan p-~p.
primo
1
Nilai awal dari rbenar-benar dapat berupa apa saja, meskipun nilai ekstrim akan membutuhkan lebih banyak iterasi. Benih terbaik (iterasi paling sedikit) sebenarnya 4e200.
Primo
6

05AB1E , 6 byte

₁žs¦¹k

Cobalah online!

Bagaimana?

₁        push 256
 žs      push pi to 256 places
   ¦     remove the leading 3
    ¹    push the input
     k   index inside that string
Uriel
sumber
Jika saya mendapatkan solusi 6-byte yang serupa dalam bahasa yang sama, setelah Anda, apakah saya menghapus jawaban saya?
nicael
@nicael biasanya tidak masalah, tetapi solusi Anda 3tetap gagal
Uriel
Oh, memang,
terima kasih
6

MATL , 16 15 byte

YP8WY$4L)jXfX<q

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
Sangat bagus dan pendek! Bisakah Anda menjelaskan cara kerjanya?
Pria acak
@Therandomguy Tentu, penjelasan ditambahkan
Luis Mendo
4

Paket R + angka, 52 byte

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

Cobalah online!

dropletPimenghitung 200 angka desimal pertama pitetapi termasuk a 3.di awal, jadi kami menghapusnya dengan substringdan kemudian mencocokkan dengan regexec, yang mengembalikan indeks pertandingan bersama dengan beberapa metadata tentang pertandingan.

Giuseppe
sumber
Mungkin regexpr(scan(),numbers::dropletPi(200))-2?
djhurio
@ Djurio yang tidak berfungsi karena kami harus mencocokkan dalam digit setelah titik desimal. Itu adalah pemikiran pertamaku juga, tetapi case itu merusaknya. Mungkin sebuah "if"?
Giuseppe
Saya tidak melihat masalah di sini. Non dari input akan berisi 3.(saya berasumsi kita berurusan dengan integer bukan real in input). Contoh uji bekerja dengan ini.
djhurio
3
@ Djjurio benar tetapi regexpr(3,numbers::dropletPi(200))-2kembali -1 ketika harus kembali 9, coba
Giuseppe
3

Jelly , 23 byte

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

Tautan monadik yang menerima daftar karakter (bilangan bulat untuk menemukan) dan mengembalikan indeks. Berfungsi untuk input yang terkandung dalam 252 digit pertama dari bagian desimal π.

Cobalah online!

Bagaimana?

Ini menggunakan rumus Leibniz untuk π untuk menghitung 253 digit pertama termasuk yang terkemuka 3(ditambah empat trailing digit yang salah). Pelopor 3kemudian dijatuhkan dan indeks input ditemukan:

⁵*⁹Ḥ;ȷḊ+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

Jika Anda lebih suka daftar digit sebagai penggunaan input ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊw(juga 23), sedangkan jika Anda benar-benar ingin memberikannya penggunaan integer ⁵*⁹Ḥ;ȷḊ+J$¤×⁹:2¤:ɗ\SDḊwD(untuk 24).

Jonathan Allan
sumber
Maksudmu transformasi Euler diterapkan pada rumus Leibniz. Menghitung 252 digit dengan rumus Leibniz akan memakan waktu sedikit lebih lama daripada kebanyakan orang mau menunggu.
Primo
Ya itu akan membutuhkan waktu lama dalam bentuk mentah (masih "menggunakan rumus Leibniz" saya percaya!)
Jonathan Allan
3

BASH (GNU / Linux), 75 67 66 byte

Disimpan 1 byte berkat Sophia Lechner, dan 7 byte berkat Sapi dukun.

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

Ini adalah skrip shell yang mengambil argumen tunggal, yaitu angka. Tes dengan

$ bash <script-path> 59
4

Script ini pertama kali mengeksekusi pipeline dari tiga perintah:

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

Hasil dari pipeline ini ditugaskan ke variabel shell a, yang kemudian digaungkan dengan apa pun kecuali nomor pertama yang dihapus:

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

Sayangnya, bcmemiliki kecenderungan untuk memutus garis output ketika mereka menjadi terlalu panjang. Ini dapat menyebabkan hasil yang salah jika nomor yang ditemukan bukan pada baris pertama. Anda dapat menghindarinya dengan mengatur variabel lingkungan BC_LINE_LENGTH:

export BC_LINE_LENGTH=0

Ini menonaktifkan fitur line breaking sepenuhnya.


Jelas, dua perintah terakhir dapat dihilangkan jika output lain ditoleransi.
Ini menghasilkan 48 byte :

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

Dengan output yang dihasilkan:

$ 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
cmaster
sumber
Bagus! Anda tidak membutuhkan ruang antara -ldan <<<meskipun.
Sophia Lechner
Anda dapat mengkonversi ke suatu program dan menggunakan sed untuk menyimpan beberapa byte, Cobalah online!
Kritixi Lithos
@ Cowsquack Bukankah saya harus memasukkan garis shebang dalam byte byte?
cmaster
@ cmaster garis shebang tidak termasuk dalam jumlah byte untuk bahasa apa pun
Kritixi Lithos
@Cowsquack Terima kasih atas sarannya. Namun, jika Anda mengizinkan output tambahan, Anda mungkin juga meninggalkannya sed(lihat bagian kedua dari jawaban saya). Namun demikian, mentransformasikan ke sebuah program memberi saya 7 byte, jadi terima kasih untuk itu! Saya juga telah mengganti tr/ headcombo dengan magic variabel shell sekarang untuk menyimpan byte lain.
cmaster
2

JavaScript, 197 187

-10: Terima kasih, Neil !

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

Mengambil serangkaian bilangan bulat basis-36 sembilan digit, mengubahnya menjadi basis 10, dan menggabungkannya untuk membuat 200 digit pi pertama.

apsillers
sumber
Bagus, Anda meledakkan usaha saya dalam menyandikan data dari air, pendekatan Anda menghemat 38 byte pada data mentah.
Nit
+1 - Saya akan memposting pendekatan yang sama persis.
darrylyeo
Gunakan x=>'50...'.replace(/.{9}/g,a=>parseInt(a,36)).search(x)+1untuk menyimpan 10 byte.
Neil
2

Pertama kali melakukan golf kode. Gunakan delegasi dan ekspresi lambda untuk mengurangi panggilan fungsi. V2 mempersingkat nama kelas menjadi satu byte.

[C #], 361 355 byte

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"));}}

Versi yang diformat:

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"));
    }
}

Ideone!

NB. Saya salah menghitung versi pertama. Itu 361 byte, bukan 363 byte.

[C #], tio versi 218 byte

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

Cobalah online!

Han
sumber
Anda tidak perlu memasukkan kotak uji dalam kode Anda, dan Anda bisa menggunakan fungsi lambda (anonim) alih-alih program lengkap
Zac Faragher
Hyarus menyarankan using System;f=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".IndexOf(f)+1;sebagai hasil edit.
Ov
Saya baru di sini dan saya pikir saya harus memasukkan program lengkap termasuk test case. Tampaknya orang menggunakan tio.run untuk demonstrasi bukan ideone. Saya melihat bahwa tio.run membagi kode menjadi beberapa bagian.
Han
2

Haskell , 208 120 byte

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

Cobalah online!

Terima kasih banyak kepada Jonathan Allan atas sarannya!

Versi lama (208 byte)

(+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

Saya sebenarnya tidak tahu bagaimana kode di atas bekerja; Saya telah mengambilnya dari makalah ini dan semua yang saya terapkan adalah bagian pencarian. g(1,0,1,1,3,3)mengembalikan digit pi dan secara mengejutkan efisien (menghitung 10.000 digit pada tio.run dalam waktu kurang dari 4s).

Input adalah daftar yang terdiri dari digit angka yang dapat ditemukan.

Cobalah online!

Cristian Lupascu
sumber
Dugaan saya adalah bahwa formula Leibniz akan jauh lebih pendek.
Jonathan Allan
@Jonathan Allan Terima kasih! Saya akan mencobanya. Saya sangat suka situs ini! Saya telah belajar banyak dari Anda, teman-teman! :)
Cristian Lupascu
@JonathanAllan Saya mencoba memperkirakan pi menggunakan l=4*sum[((-1)**x/(2*x+1))|x<-[0..1e6]], tetapi itu membutuhkan 5s untuk dijalankan dan digit ke-7 sudah salah. Jadi mungkin tidak layak untuk menghitung 200 digit. Latihan itu menarik, jadi terima kasih!
Cristian Lupascu
1
Anda ingin menggunakan transformasi Euler (lihat jawaban Jelly saya atau jawaban Python primo)
Jonathan Allan
1
Sehubungan dengan makalah yang Anda tautkan, Anda mungkin tertarik pada pos ini , di mana saya menerapkan kembali kode yang ditemukan dalam makalah ini tanpa "kebingungan yang disengaja." Ini juga sedikit lebih sederhana (lebih pendek) sebagai hasilnya. Lihat metode g1_refdi bagian Generator Tidak Terbatas Lebih Cepat . Kodenya adalah python.
primo
2

Haskell, 230 byte

Menggunakan kemalasan untuk menemukan angka di mana saja dalam angka pi yang tak terbatas, tidak hanya dalam 200 angka pertama. Oh ya, dan itu mengembalikan Anda setiap (jumlah tak terhingga?) Dari nomor tersebut, bukan hanya yang pertama.

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]

Contoh dari tantangan

>  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]

Kredit

'p' adalah aliran pi digit tanpa batas, diambil dari https://rosettacode.org/wiki/Pi#Haskell

> take 20 p
[3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4]
tombop
sumber
Saya kira Anda sudah tahu ini, tetapi Anda hanya perlu menampilkan nomor pertama dalam urutan Anda ...
Timtech
Saya pikir saya akan menerima
ketidakterbatasan
2

SmileBASIC, 179 164 byte

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

Digit pi di-hardcode dan dimasukkan ke dalam nilai karakter ascii. 14 -> CHR$(14), 15 -> CHR$(15), 92 -> \, 65 -> A, 35 -> #.

String berisi karakter yang tidak dapat dicetak, jadi inilah byte yang ditulis dalam heksadesimal: 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

Dalam desimal, Anda dapat melihat digit 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

12Me21
sumber
Jika Anda memposting kode lengkap, akan lebih mudah untuk memverifikasi jawaban Anda.
Primo
1
Saya tidak dapat mempostingnya karena ada karakter yang tidak valid yang dihapus / tidak ditampilkan. Saya kira saya dapat memposting kode ascii sekalipun.
12Me21
Anda dapat memposting hexdump, menggunakan xxd misalnya.
Nathaniel
2

Ruby , 37 35 byte

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

Cobalah online!

Tidak ada yang istimewa, hanya memamerkan perpustakaan bawaan. Output diindeks 0. String Pi diformat sebagai 0.31415...e1, jadi kita perlu menghapus 3 karakter pertama. Bagian e1pada akhirnya tidak benar-benar membahayakan, tetapi dilucuti juga, karena kita perlu memberikan nilai akhir rentang (atau panjang irisan).

Kirill L.
sumber
pendek DAN terbaca!
pjs
2

Arang , 27 15 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Berfungsi hingga hampir 1000 digit. Penjelasan:

        ≕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
Neil
sumber
diperbaiki, 13 byte . catatan: ini terasa benar-benar curang: P
ASCII-satunya
sebenarnya diperbaiki, 13 byte . menggunakan input implisit. (bukan perilaku yang dimaksudkan tetapi tampaknya lebih bermanfaat daripada cara lain). Anda juga dapat menautkan ke contoh bug isi?
ASCII
@ ASCII-only Isi keanehan - mengapa kursor berakhir di sana?
Neil
: | oh saya tidak tahu saya harus memperbaikinya secepatnya
ASCII-hanya
nvm saya idiot , perbaikan berkomitmen.
ASCII
2

Japt , 186 177 bytes

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

Karena Japt berbagi 15-digit pi kendala dan shoco Javascript , penyandian yang digunakan oleh Japt, tidak menyandikan angka, beberapa shenanigans diperlukan untuk kompresi.

Dijelaskan dengan singkat, awalnya adalah string di bawah ini dalam bentuk yang disandikan:

"nqnrvosrpruvtvpopuqsosqppupotvrmouuqnvtnsvpvvptrnmruomvtqvqqrvopmtunsqmsousomuvvusoumpquorpqonntmstvuonqumusrnpouopmssqtmvpuqqsmvrrmruoopntorprvqmunouqunnntqrmouqnmotmnvpuronnmrrrvsqqsoovquvrqvpmpunvs"

Yang merupakan string di mana setiap huruf berada 'm' + corresponding digit of pi . Saya menguji seluruh alfabet dan surat itu memberikan kompresi terbaik dengan beberapa byte.

Backticks memberitahu Japt untuk memecahkan kode string. Sisanya cukup mudah:

®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.

Menghasilkan indeks berbasis 0 dari fragmen yang cocok.
Dicukur dua byte lagi berkat Oliver .

Cobalah online!

Nit
sumber
1
Ide pintar! Anda dapat mengganti £Xdengan ®dan } denganÃ
Oliver
@Liver Terima kasih banyak untuk itu, saya masih belajar Japt jadi semua bantuan sangat dihargai.
Nit
1
Anda telah melakukan yang terbaik sejauh ini! Saya ingin tahu apakah ada offset yang lebih baik dari 109. Saya membuat bruteforcer , dan ternyata 109 optimal. Bagus sekali :)
Oliver
@Liver Terima kasih untuk itu, saya cukup mencoba seluruh rentang az secara manual karena tidak terlalu banyak pekerjaan. : P
Nit
1

AWK -M, 131 119 117 byte

Menggunakan -Mbendera untuk perhitungan presisi acak. Menambahkan p=k=0(5 byte) ke tautan TIO untuk memungkinkan input multi-line

{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

Cobalah online!

Penjelasan:

{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
Robert Benson
sumber
Upaya pertama saya digunakan sprintfuntuk mendapatkan desimal. Penggunaannya CONVFMTjelas lebih bersih.
Robert Benson
2
Tidak perlu menggunakan bendera: konsensus meta adalah untuk menganggap ini sebagai bahasa yang berbeda dari AWK , "AWK dengan -Mbendera"
Giuseppe
Senang mendengarnya. Saya kira saya harus menghabiskan lebih banyak waktu untuk meta ... dengan banyak waktu luang saya. :)
Robert Benson
1

Jelly , 24 byte

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

Cobalah online!

Gunakan formula seperti Machin , khususnya 1/4 pi == tan -1 (1/2) + tan -1 (1/3).

Gunakan rumus pi / 2 == 1 + 1/3 × (1 + 2/5 × (1 + 3/7 × (1 + 4/9 × (...)))))

pengguna202729
sumber
Apakah ada cara untuk mendapatkan angka dari ØPdalam M?
dylnan
@ Dylnan Agak , tapi M bukan Jelly.
user202729
Saya tahu mereka berbeda. Tidak percaya saya tidak memikirkan floor. Keberatan jika saya menggunakannya untuk mengirim sebagai jawaban dalam M?
dylnan
Sudahlah. Tidak berfungsi di atas 104 angka ...
dylnan
1

Python 2 239 238 229 214 byte

-9 byte karena @primo

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

Gunakan algoritma Chudnovsky-Ramanujan untuk menemukan 1 juta digit pertama 50.000 digit 00 (ubah 10**10**5menjadi 10**10**6lebih banyak, tetapi butuh waktu lama untuk menjalankannya) dan kemudian cari mereka untuk string yang diinginkan.

DividedByZero
sumber
Saya mencoba mengkonfirmasi hasilnya tetapi sepertinya tidak berakhir ( n=10**10**5butuh sekitar 10-an).
primo
@ Grimo Saya tidak pernah mengatakan itu cepat! 10**10**6membutuhkan sekitar 7 menit pada mesin saya .. Agar adil, 10**10**5memberikan angka 50.000 pertama, jadi saya kira itu tidak terlalu buruk :)
DividedByZero
@ primo Saya telah mengubah perpustakaan presisi acak ke bigfloat, sekarang berjalan jauh lebih cepat.
DividedByZero
Jauh lebih cepat sekarang, saya akan menyarankan beralih ke gmpy2, tetapi bigfloatmenghemat selusin byte. Tugas dari kdapat digabungkan dengan k=b=0jika Anda pindah k+=1ke awal iterasi. -(6*k-5)*(2*k-1)*(6*k-1)dapat ditulis lebih ringkas sebagai k*(k*(108-72*k)-46)+5. Jika Anda mendeklarasikan Python 2, //divisi integer dapat diganti dengan /, dan juga tanda kurung tidak diperlukan print. Spasi juga dapat dihapus di import*. Hanya memvalidasi hingga 50.000 digit, btw.
primo
The ndi sqrt(10005*n)tampaknya menjadi masalah; itu memindahkan titik desimal ke tempat 50000. Jika Anda tertarik, inilah implementasi Chudnovsky saya sendiri: Cobalah online!
primo
1

Visual Basic - 114 Bytes

Oke, pengiriman pertama. Tenang aku!

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

Umpan balik, terima kasih!

Saya tidak terbatas pada 256 bagian pertama dari PI karena pertanyaannya mengatakan "Anda tidak harus", bukan "Anda seharusnya tidak" Harap saya melakukan ini dengan benar :)

pengguna9338709
sumber
Saya tidak tahu banyak tentang virtual dasar, tetapi saya kira Anda dapat menyimpan beberapa byte dengan menghapus semua ruang. Anda juga harus dapat menyimpan kode Anda ke dalam suatu fungsi dan mengembalikan nilai alih-alih "console.log" itu (saya kira Anda akan mendapatkan beberapa byte seperti itu). Oh, dan Anda harus memasukkan nilainya dan tidak memasukkannya dalam hardcode.
Pria acak
Terima kasih. Menghapus spasi dan menghapus nilai hardcode yang mendukung input. Meningkatkan hitungan menjadi 114! Apakah fungsi untuk mengembalikan nilai tidak termasuk dalam jumlah byte? Saya membayangkan itu akan membuatnya lebih lama jika demikian.
user9338709
Selamat datang di situs ini! Ini sepertinya berfungsi ( coba online! ), Tetapi tampaknya potongan dan pengajuan harus berupa program lengkap, atau fungsi.
Dom Hastings
Sesuatu seperti ini mungkin berhasil, tetapi mungkin ada cara yang lebih baik untuk melakukan hal-hal itu! Lihat menu tautan di bagian atas halaman itu untuk melihat template yang banyak digunakan pengiriman!
Dom Hastings
Sebenarnya, sepertinya konstanta tidak memiliki 200 digit :( Cobalah online! - ini akan mengembalikan 197.
Dom Hastings
0

Javascript 217 byte (200 hardcoded)

a=>"14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196".search(a)+1
Luis felipe De jesus Munoz
sumber
0

PHP, 27 byte

Bukan jawaban yang sangat serieus, ini membutuhkan perubahan dalam pengaturan php.ini sebagai pi () default ke 14 digit, bukan 200, tetapi untuk sekali solusi PHP cukup elegan:

<?=strpos(pi(),$_GET[n])-1;
Martijn
sumber
Saya pikir ini tidak akan berhasil. yang precisiontag di alter hanya php.ini layar presisi, dan tidak benar-benar meningkatkan ketepatan konstanta didefinisikan. saksi
primo
0

Julia 0,6 , 53 byte

setprecision(9^6)
x->searchindex("$(big(π))","$x",3)

Atur presisi untuk BigFloats cukup tinggi, lalu konversikan pike string dan cari. Presisi 9^6menangani 159980 digit.

Cobalah online!

gggg
sumber
0

J, 25 Bytes

{.I.(}.":<[email protected]^999)E.~

Cobalah online!

Diindeks 0

Mengambil input sebagai string, +2 Bytes ( ":) jika itu tidak diizinkan.

Penjelasan akhirnya.

Bolce Bussiere
sumber
0

Perl 5 dengan -MMath::BigFloat+bpidan -n, 20 byte

bpi($>)=~/.$_/;say@-

Cobalah online!

Saya tidak yakin penggunaan mana dari $>tribun, karena itu adalah EFFECTIVE_USER_IDyang tidak portable, tapi di TIO ini adalah 1000 dan memenuhi persyaratan kami, untuk -1 byte vs 200.

Dom Hastings
sumber
0

Sekam , 5 byte

€tİπd

Cobalah online!

€        The 1-based index as a substring of
    d    the decimal digits of
         the input
  İπ     in the infinite list of digits of pi
 t       after the radix point.
String yang tidak terkait
sumber